javascript - 与其他浏览器相比,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 < 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 却粗暴地打乱了它。该数组未按预期顺序排列。例如,至少在一种情况下,“_36”出现在 console.log 中的“_0”之前,然后另一个键任意乱序。

请记住,JSON 对象会正确返回。它只是重新排序对象的 data 元素没有被正确地插入数组。我错过了什么?

注意 1:_0 等中的键/值对。没有关系。那不是问题所在。我正在运行一个循环,但数组的顺序不正确。

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

最佳答案

javascript 对象的元素之间没有顺序,所以如果你有类似的东西

var data: {
  _0: 'zero',
  _1: 'one'   
}

没有“第一属性”和“第二属性”,因此您不能期望 Object.keys 返回的键数组遵循任何顺序。唯一的限制是

The Object.keys() method returns an array of a given object's own enumerable properties, in the same order as that provided by a for...in loop (the difference being that a for-in loop enumerates properties in the prototype chain as well).

摘自 MDN page (粗体是我的)。

If an implementation defines a specific order of enumeration for the for-in statement, the same order must be used for the elements of the array returned [by Object.keys]

来自 ECMA specs .

如果需要保证顺序,在循环之前对key数组进行排序:

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

关于javascript - 与其他浏览器相比,Chrome 数组排序不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33761638/

相关文章:

javascript - 如何从 TypeScript 访问对象属性?

javascript - 自动刷新 Controller 和 View Yii

Java:String.length() > 0 和 Array.size() > 0 简写?

json - 在 Go 中解码 JSON 标记联合

javascript - 需要帮助理解方向公式

javascript - 对具有 "A/B"格式的数字的数组进行排序?

javascript - 如何在 JavaScript 中构建一个计算数组中出现次数的对象?

php - 比较数组 : one array is contained in the second array (key+value)

java - 使用 HttpURLConnection 发送 UTF-8 字符串

json - 不知道如何在Powershell中获取JSON对象的名称字段?