最初我曾经有过这个问题,虽然数据集是正确的,依赖于javascript中的排序,就数组来说是不正确的,所以我的解决方案是这样的,只要json是返回
var json = { //Returned from a database
data: {
_0: {key1: val1, key2: val2},
_1: {key1: val1, key2: val2},
...etc etc etc
}
};
var new_arr = [];
for(var i = 0; i < Object.keys(json.data).length; i++) {
var obj = json.data["_"+i];
new_arr.push(obj);
}
console.log(new_arr);
在IE8-11,Firefox,Opera(或任何其他浏览器)中,这种行为与您期望的一样。根据返回的原始json对象中的键保留顺序。
但是,Chrome会不经意地将此问题排除在外。该数组不是预期的顺序。例如,在至少一种情况下,&#34; _36&#34;出现在&#34; _0&#34;之前在console.log
中,另一个密钥随意乱序。
请记住JSON对象正确返回。它只是重新排序对象的data
元素,而不是正确地推入数组。我错过了什么?
注1:_0
等人内部的键/值配对。没有关系。这不是问题所在。我正在运行循环,并且数组的顺序不正确。
注2:循环正确。它以正确的顺序访问json.data的属性。问题是他们没有按正确的顺序进入阵列。
答案 0 :(得分:3)
javascript对象的元素之间没有顺序,所以如果你有像
这样的东西var data: {
_0: 'zero',
_1: 'one'
}
没有&#34;第一个属性&#34;和&#34;第二个属性&#34;,所以你不能指望Object.keys
返回的键数组遵循任何类型的顺序。唯一的限制是
Object.keys()方法返回给定对象自己的数组 可枚举属性,的顺序与a提供的顺序相同 for ... in loop (不同之处在于for-in循环枚举 原型链中的属性也是如此。
从MDN page中提取(粗体是我的。)
如果实现定义了枚举的特定顺序 for-in语句,必须使用相同的顺序作为元素 数组返回 [by Object.keys]
来自ECMA specs。
如果您需要确保订单,请在循环前对键数组进行排序:
var new_arr = [];
var keys=Object.keys(json.data);
keys.sort(function () {....}); //custom comparator here
for(var i = 0; i < keys.length; i++) {
var obj = json.data["_"+i];
new_arr.push(obj);
}