2014-02-20 26 views
1
{"/book":1,"/order":2,"deliver":3} 

在我的應用程序的UI,當我點擊/本書,我知道從地圖上看,去什麼樣的步驟。 有時我只是想通過增加數量,但要確保網址也改變去下一步。我可以假設Object.keys的響應順序是否相同?

我該怎麼做從步驟到關鍵的反向映射。

我遇到了ECMAScript 5中引入的Object.keys。 返回的鍵列表中元素的順序是否始終相同?

["/book","/order","deliver"] 

如果是的話那麼爲什麼呢?字典是無序的嗎?

回答

1

ECMAScript 5.1 specification指出

當用參數O調用鍵功能時,以下步驟 採取:

  1. 如果Type(O)不是Object,則引發TypeError異常。
  2. 設n爲O
  3. 的自己的可枚舉的屬性的數目設陣列是創建一個新對象的結果,就好像由表達式新陣列(n),其中陣列是內置 構造具有該名稱的標準。
  4. 設指數是0。
  5. 鄰的,其名稱的字符串是P中的每個自己枚舉屬性: 的(a)調用以ToString(指數)陣列的[[DefineOwnProperty]]內部的方法,所述的PropertyDescriptor {[ [數值]:P, [[可寫]]:真,[可枚舉]]:真,[[配置]]:真},和 假。通過1
  6. 返回陣列 (b)中遞增索引。

如果一個實現定義枚舉爲 特定順序爲式聲明,相同的枚舉順序必須在該算法的步驟5 使用。

Mozilla的開發網絡具有這樣說的for-in loop

一種...in循環以任意順序迭代對象的屬性(有關更多信息,請參閱delete運算符,爲什麼不能依賴迭代的看似有序性,至少在跨瀏覽器設置中)。

而且參考delete operator導致這個:

雖然ECMAScript中,使對象的迭代順序實現相關的,它可能會出現所有主流瀏覽器都支持基於最早添加的屬性的迭代順序首先來到(至少對於不在原型上的屬性)。但是,對於Internet Explorer,當使用屬性上的刪除時,會出現一些令人困惑的行爲結果,從而阻止其他瀏覽器將諸如對象文字這樣的簡單對象用作有序關聯數組。在資源管理器中,儘管屬性值確實設置爲未定義,但如果稍後添加具有相同名稱的屬性,則該屬性將在其舊位置進行迭代 - 而不是迭代序列的末尾,正如人們在刪除該屬性,然後將其添加回來。所以如果你想在一個跨瀏覽器環境中模擬一個有序的關聯數組,你不得不使用兩個單獨的數組(一個用於鍵值,另一個用於值),或者構建一個單數組的數組,屬性對象等等

我認爲結論從中得出的結論是,一個單一的瀏覽器中,該命令將是任意的,而是一致的,但如果你比較多個瀏覽器,則順序可以跨越這些瀏覽器不同(尤其是如果你正在刪除並重新添加屬性)。

編輯:

如果要基於相關值的鍵進行排序,那麼你可以做這樣的事情:

var map = { b: 2, a: 1, c: 3 }; 

var keys = Object.keys(map); 

console.log(keys); // [ 'b', 'a', 'c' ] 

var sorted_keys = keys.slice(0); // sliced so that we can see the difference in order 

sorted_keys.sort(function(a, b){ return map[a] - map[b]; }); 

console.log(sorted_keys); // [ 'a', 'b', 'c' ] 
1

它是由執行。從ES5 spec on Object.keys

如果實現定義枚舉爲換在聲明中,同樣的枚舉順序必須在此算法的步驟5中使用的特定的順序。

的 「第5步」 中提到有沒有指定的順序:

  5.對於每個擁有Ø他的名字字符串是P的枚舉財產......

相關問題