如何在保持键查找的同时保持Javascript对象/数组的有序性?
我有一些数据最初存储在一个通用Javascript对象中,ID作为键:如何在保持键查找的同时保持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"}, ... ] 现在,我可以
{
"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];
});