如何在保持键查找的同时保持Javascript对象/数组的有序性?

如何在保持键查找的同时保持Javascript对象/数组的有序性?,javascript,data-structures,Javascript,Data Structures,我有一些数据最初存储在一个通用Javascript对象中,ID作为键: { "7": {"id":"7","name":"Hello"}, "3": {"id":"3","name":"World"}, ... } 然而,我发现浏览器在循环浏览时不能保证特定的对象顺序,所以在上面的3个例子中,7之前会出现。我切换到使用如下数组格式: [ {"id":"7","name":"Hello"}, {"id":"3","name":"World"}, ... ] 现在,我可以

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

{
  "7": {"id":"7","name":"Hello"},
  "3": {"id":"3","name":"World"},
  ...
}
然而,我发现浏览器在循环浏览时不能保证特定的对象顺序,所以在上面的3个例子中,7之前会出现。我切换到使用如下数组格式:

[
  {"id":"7","name":"Hello"},
  {"id":"3","name":"World"},
  ...
]
现在,我可以按正确的顺序循环,但不能进行快速查找,例如数据[3],而不必在数组中循环


有没有一个很好的方法将这两种方法结合起来?我宁愿避免为每种格式使用单独的对象,因为该对象相当大,包含数百个元素。

我也遇到过这个问题。一种解决方案是在原始对象之外保留一个有序的键数组

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中打印此内容,将得到如下结果:

{
    1: "1",
    2: "2",
    "a": "a",
    "b": "b"
};
有点酸。。但是生活

您也可以使用Andy链接的解决方案,基本上将这两个对象包装在一个对象中

我经常使用的另一种方法是自定义映射函数,它允许您指定对象的遍历顺序。通常,当您将数据打印给用户时,您将进行排序,因此当您循环并创建表行时,例如,迭代器将按照排序函数指定的顺序传递行。我觉得这是个好主意:

签名看起来像:

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];
});

有现成的库可以提供提供提供的JSON解析或一致排序的JSON打印以供显示,而不是自己编写代码

你可以仔细考虑以下任何一个:

该软件包提供解析、格式化和漂亮的打印,并具有稳定的顺序。这是基于有序的输入。 该包提供基于排序的确定格式。
不确定有没有比我所链接的答案更好的方法来实现这一点。这打破了你避免每个物体都被分开的目标,但我想知道一个更好的方法自ECMAScript 2015又名ES6以来。好主意,谢谢!实际上,我做了与你建议相反的事情,将主数据存储作为一个数组,以便更好地循环,然后我将数组索引存储在一个动态生成的对象中;我
map(object, function (row) {
   table.add_row(row.header, row.value);
}, function (key1, key2) {
   return object[key1] - object[key2];
});