2015-11-17 82 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

否,他們不需要引用 –

相關問題