gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:11:09 26 4
gpt4 key购买 nike

最初我有一段时间遇到这个问题,虽然数据集是正确的,但就数组而言,依赖 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com