2

陣列(項目注順序):數組在javascript排序 - 不同的結果比較IE8和Chrome

{ 
    "5":{ 
     "Title":"Title A", 
     "Desc":"Description A" 
    }, 
    "15":{ 
     "Title":"Title B", 
     "Desc":"Description B" 
    }, 
    "10":{ 
     "Title":"Title C", 
     "Desc":"Description C" 
    }, 
    "1":{ 
     "Title":"Title D", 
     "Desc":"Description D" 
    }, 
    "20":{ 
     "Title":"Title E", 
     "Desc":"Description E" 
    } 
} 

現在,js代碼下面確實改變了訂單,如果在Chrome或IE9運行。

for (var i in data) { 
    alert(JSON.stringify(data[i])); 
} 

IE8保留原來的順序,而新的瀏覽器更改爲1,5,10,15,20

任何想法,爲什麼這可能是這樣嗎?是否有可能在新的瀏覽器中保留原始順序?

非常感謝,盧克

+7

這不是一個數組。這是一個對象。對象沒有訂單。例如, – Blender

+1

+1。我一直想看到一個證據,即物體訂單不會保存在物體中。 – Christophe

+0

對於那些想知道的,JavaScript對象基本上被實現爲字典/散列表。因此,未定義的排序。 – voithos

回答

6

你在那裏沒有一個數組。它只是一個對象,屬性的顯示順序是未定義的。

編輯 —有趣的事實:該規範指出,如果實現決定做廣告某些特定的順序在for ... in語句,然後Object.keys()必須遵守相同的排序規則。然而,不需要這樣的規則。該規範沒有詳細說明如何實現「未定義」,但對我來說,一個好的經驗法則是編碼,就好像命令可能被主動隨機化一樣:-)

1

你有什麼沒有一個數組,而是一個對象。對象沒有任何順序。瀏覽器按照他們想要的順序返回鍵。

如果你想要一些固定的順序,把你的對象到一個數組:

{ 
    "objects": [ 
     { 
      "id": "5", 
      "Title":"Title A", 
      "Desc":"Description A" 
     }, 
     { 
      "id": "15", 
      "Title":"Title B", 
      "Desc":"Description B" 
     }, 
     { 
      "id": "10", 
      "Title":"Title C", 
      "Desc":"Description C" 
     }, 
     { 
      "id": "1", 
      "Title":"Title D", 
      "Desc":"Description D" 
     }, 
     { 
      "id": "20" 
      "Title":"Title E", 
      "Desc":"Description E" 
     } 
    } 
}