Javascript 与其他浏览器相比,Chrome阵列排序不正确

Javascript 与其他浏览器相比,Chrome阵列排序不正确,javascript,arrays,json,google-chrome,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

不久前,我遇到了这个问题,数据集是正确的,就数组而言,依靠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);
var json={//从数据库返回
数据:{
_0:{key1:val1,key2:val2},
_1:{key1:val1,key2:val2},
…等等
}
};
var new_arr=[];
for(var i=0;i
在IE8-11、Firefox、Opera(或任何其他浏览器)中,它的行为与您预期的一样。根据返回的原始json对象中的键保留顺序

然而,Chrome却把这一点简单地排除在外。数组的顺序不符合要求。例如,在至少一种情况下,“\u 36”出现在
控制台.log中的“\u 0”之前,则另一个键任意出现故障

请记住,JSON对象返回正确。只是对对象的
数据
元素重新排序,没有正确地将其推入数组。我错过了什么

注1:
\u 0
等内部的键/值配对无关紧要。这不是问题所在。我正在运行一个循环,而数组的顺序不正确


注2:循环是正确的。它以正确的顺序访问json.data的属性。问题是它们没有以正确的顺序进入数组。

javascript对象的元素之间没有顺序,因此如果您有

var data: {
  _0: 'zero',
  _1: 'one'   
}
没有“第一个属性”和“第二个属性”,因此不能期望
Object.keys
返回的键数组遵循任何类型的顺序。唯一的限制是

方法返回给定对象自身的数组 可枚举属性,的顺序与 for…in循环(区别在于for in循环枚举 原型链中的属性)

摘自(粗体是我的)

如果实现为 对于in语句,必须对的元素使用相同的顺序 返回的数组[由Object.keys返回]

如果需要确保顺序,请在循环之前对密钥数组进行排序:

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);
}
var new_arr=[];
var keys=Object.keys(json.data);
排序(函数(){…})//这里是自定义比较器
对于(变量i=0;i
规范中目前没有说明键的遍历顺序,因此它不是“不正确的”。将来可能会更改。JSON不保证返回对象的顺序,即使您这样将它们推送到数组中。如果需要对象的特定顺序,则必须在使用数组之前对其进行排序。但这里的关键是,我通过循环直接访问这些属性(
\u 0
\u 1
\u 2
,等等)。JSON的顺序并不重要,这是一个解决方案。当我尝试将它转换为对象数组时,它仍然是无序的。有没有可能我误解了前面的评论?当你遍历一个对象(你的
数据是什么)时,键的顺序就不能保证了,因为它不是一个有序的结构。然而,数组是一种有序结构。我知道这对你没有任何帮助,但这就是事情的运作方式,事实上没有问题,除了你依赖浏览器提供元素以书面形式出现的顺序。解决方案是要么给自己发送一个实际数组,要么循环对象并手动进行转换。但我通过循环手动访问json.data的键,顺序是
\u 0
\u 1
,等等。我并不是依赖于浏览器中的顺序,而是依赖于分配给这些数据集的名称。我不在乎它们进入的顺序,而
Object.keys().length
只是获取for循环的数据集长度。以这种方式进行操作应该意味着所有内容都按正确的顺序推入数组。但在chrome中,它不是。难道你的键不需要被引用才能合法吗?
\u 0
\u 1
不需要被引用才能合法吗?不,0是变量属性的有效标识符,“-0”需要被引用,例如不,它们不需要被引用操作。我的错。戴上我的JSON帽子。你怎么能说没有顺序,但它的顺序与中的相同?