与其他浏览器相比,Chrome数组排序不正确

时间:2015-11-17 16:06:54

标签: javascript arrays json google-chrome

最初我曾经有过这个问题,虽然数据集是正确的,依赖于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的属性。问题是他们没有按正确的顺序进入阵列。

1 个答案:

答案 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);
}