如何保持Javascript对象/数组的sorting,同时也保持密钥查找?

我有一些数据,我最初存储在一个通用的JavaScript对象,ID作为一个关键:

{ "7": {"id":"7","name":"Hello"}, "3": {"id":"3","name":"World"}, ... } 

但是,我发现浏览器在循环播放时不能保证特定的对象顺序,所以在上面的“3”中会出现在“7”之前。 我切换到使用这样的数组格式:

 [ {"id":"7","name":"Hello"}, {"id":"3","name":"World"}, ... ] 

现在,我可以循环正确的顺序,但不能快速查找,例如data["3"]而不必循环数组。

有两种方法结合使用的好方法吗? 我宁愿避免为每种格式使用单独的对象,因为对象相当大(数百个元素)。

我也碰到过这个问题。 一个解决scheme是除了原始对象之外还保留一个有序的键数组。

 var objects = { "7": {"id":"7","name":"Hello"}, "3": {"id":"3","name":"World"}, ... } var order = [ "3", "7", ... ]; 

现在,如果你想要第二个元素,你可以做这个查找:

 var second_object = objects[order[1]]; 

ECMA标准没有提到对象中元素的顺序。 特别是当Chrome 看起来像数字时,Chrome会重新sorting。 例:

 var example = { "a": "a", "b": "b", "1": "1", "2": "2" }; 

如果您在Chrome中打印此类会得到像这样的东西:

 { 1: "1", 2: "2", "a": "a", "b": "b" }; 

这有点酸,但生活。

你也可以使用Andy连接的解决scheme,基本上把这两个包装在一个对象中。

我使用了很多的替代scheme是一个自定义地图函数,它允许您指定对象遍历的顺序。 通常,当您将数据打印到用户时,您将进行sorting,以便在循环和创build表格行时(例如),迭代器将按sorting函数指定的顺序传递行。 我认为这是一个不错的主意:)

签名看起来像:

 function map(object, callback, sort_function); 

用法示例:

 map(object, function (row) { table.add_row(row.header, row.value); }, function (key1, key2) { return object[key1] - object[key2]; });