2015-11-17 37 views
1

最初我有这个问题,虽然数据集是正确的,依赖于JavaScript中的排序就数组而言是不正确的,所以我的解决方案是这样的,只要返回的JSONChrome阵列排序不正确VS其他浏览器

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,火狐,歌剧(或任何其他浏览器),这表现为你所期望的。按照返回的原始json对象中的键保存顺序。然而,铬,却使这无序地滥用。数组未按预期顺序排列。例如,在至少一个案例中,“_36”出现在console.log的“_0”之前,则另一个密钥任意乱序。

请记住JSON对象正确返回。这只是重新排序对象的data元素未被正确推入阵列。我错过了什么?

注1:_0 et al中的键/值配对。没有关系。这不是问题所在。它与我一起运行一个循环,并且数组没有按照正确的顺序。

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

+0

目前没有什么规范,指出键的顺序遍历,所以它不是“不正确”。将来可能会改变。 – TbWill4321

+1

JSON不保证返回对象的顺序,即使您将它们推送到您的数组时也是如此。 http://stackoverflow.com/a/5525820/4515720如果您期待特定的对象排序,则在使用它之前,您必须对阵列进行排序。 –

+0

这里的踢球者是我直接通过循环('_0','_1','_2'等)访问这些属性。 JSON命令有他们无关紧要,这是一个解决方案。当我尝试将其转换为一个对象数组时,它仍然不合适。 有没有可能我误解了以前的评论? – Orpheus

回答

3

有一个JavaScript对象的元素之间没有顺序,因此,如果您有类似

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

没有“第一要素”和“第二个属性”,所以你不能指望的阵列由Object.keys返回的密钥遵循任何种类的顺序。唯一的限制是

的Object.keys()方法返回在给定对象自己的 枚举的属性的以相同的顺序作为由 for ... in循环提供的阵列,(该不同之处在于for-in循环枚举了原型链中的 属性)。

MDN page中摘录(粗体是我的)。

如果一个实现定义枚举为 特定顺序为式声明,相同的顺序必须被用于 阵列的元件返回[由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); 
} 
+0

您的密钥'_0','_1'是否需要引用为合法? – spender

+0

不,_0是变量属性的有效标识符,需要引用“-0”,例如 –

+0

否,他们不需要引用 –

相关问题