2011-09-14 50 views
4

在我的Javascript应用程序中,我有一个对象,我需要能够通过内部对象中的值来排序数组。按值排序Javascript对象

例如:

{ 
    a : { 
     timestamp: xxxxxx 
     other : yyyyyy 
    }, 
    b : { 
     timestamp: xxxxxx 
     other : yyyyyy 
    }, 
    c : { 
     timestamp: xxxxxx 
     other : yyyyyy 
    } 
} 

我需要做的是管理该数据集并重新以便根据每个内对象的时间戳阵列。

他们能做些什么来做到这一点?

更新:

我最初的想法是做类似这样:

{ 
    a : {}, 
    b : {}, 
    c : {}, 
    _ : [ 
     c, a, b //Key's Only 
    ] 
} 

然后重新索引基于这样的价值观的对象,这将挑选出如何索引的对象,但当我插入一个新元素时,我还需要重新生成_索引关系,这似乎付出了很多努力。

回答

2

Javascript对象是而不是关联数组。他们可能行为相似,但他们不一样。 Javascript没有关联数组。

虽然关联数组有一个有序的概念,但Javascript对象根本不会与它们共享这个特定的功能。由于那里的性质,物体并不是有序的。

因此,要回答你的问题:你不能命令他们......

+1

当然,对象没有顺序,但这并不意味着没有可能的解决方案。 – jondavidjohn

+0

您可以创建索引,键值和“顺序”的哈希表,并在需要时使用从一个数组到对象的引用 – Miguel

2

你不处理数组,但随着ab属性值的对象,c

没有因为你不能以任何特定的顺序真正地循环它们,所以你会按照特定的顺序需要它们。

这将是微不足道的(使用)如果你使用数组...

var array = [ 
    { 
     timestamp: xxxxxx 
     other : yyyyyy 
    }, 
    { 
     timestamp: xxxxxx 
     other : yyyyyy 
    }, 
    { 
     timestamp: xxxxxx 
     other : yyyyyy 
    } 
]; 

array.sort(function(a,b) { 
    return a.timestamp - b.timestamp; 
}); 
+0

数组的问题是它们没有基于字符串的索引,并且可以快速访问元素需要基于字符串的索引。 – RobertPitt

+0

所有JavaScript索引***是***字符串和JavaScript数组***是***对象,它们只是有一些额外的有用功能...一个你是专门后... http://jsfiddle.net/Mb8xC/ – jondavidjohn

2

当别人已经说过,你是在处理与关联对象。不是数组。对象没有秩序。

如果你想保持原样,而是排序键的数组,你可以这样做:

var obj = { 
    a : { 
     timestamp: xxxxxx 
     other : yyyyyy 
    }, 
    b : { 
     timestamp: xxxxxx 
     other : yyyyyy 
    }, 
    c : { 
     timestamp: xxxxxx 
     other : yyyyyy 
    } 
}; 

var keys = []; 
for(var key in obj) { 
    keys.push(key); 
} 

keys.sort(function(a, b) { 
    return obj[a].timestamp - obj[b].timestamp; 
}); 

现在你可以通过数组值访问对象(如OBJ [键[0]],obj [keys [1]]等)。这假定时间戳是数字的。如果他们是Date对象的排序应该是:

keys.sort(function(a, b) { 
    return +obj[a].timestamp - (+obj[b].timestamp); 
}); 

如果时间戳实际上是表示日期时间(如“2012年8月2”)的字符串,那么就应该是:

keys.sort(function(a, b) { 
    return +new Date(obj[a].timestamp) - (+new Date(obj[b].timestamp)); 
}); 

所以使用你的场景中最有意义的东西。

0

您可以创建自定义比较器函数,并对数组使用内置排序函数。看到这个post

6

您可以将数据复制到一个数组,然后对它进行排序:

var data = { 
    a : { 
     timestamp: 11111, 
     other : "xxx" 
    }, 
    b : { 
     timestamp: 22222, 
     other : "yyy" 
    }, 
    c : { 
     timestamp: 33333, 
     other : "zzz" 
    } 
}; 

var output = []; 

// copy items to an array so they can be sorted 
for (var key in data) { 
    data[key].key = key; // save key so you can access it from the array (will modify original data) 
    output.push(data[key]); 
}  

output.sort(function(a,b) { 
    return(a.timestamp - b.timestamp); 
}); 

生成此作为输出(注意我说原来的关键对象,因此它的访问从数组):

[{"timestamp":11111,"other":"xxx","key":"a"}, 
{"timestamp":22222,"other":"yyy","key":"b"}, 
{"timestamp":33333,"other":"zzz","key":"c"}] 

你可以在这里看到这个工作:http://jsfiddle.net/jfriend00/hXpkP/

+0

不要忘记对象属性的* hasOwnProperty *测试,或者您可能会包含inhertied属性。 – RobG