2015-05-28 38 views
1

考慮對象:如何使`Object.keys`尊重對象中'聲明'鍵的順序?

var opts = { 
    'all': 'All', 
    0: 'Some option', 
    1: 'Cookies', 
}; 

Object.keys(opts)返回此:

["0", "1", "all"] 

我期待這樣的:

["all", "0", "1"] // The order in which the keys are 'declared' in the obj 

我該如何迭代它們在對象中出現的順序?

謝謝。

+4

有一個在對象沒有順序,因此期待以某種順序總是會失敗 – adeneo

+0

[Object.keys](https://developer.mozilla.org/en-US/docs/Web/JavaScript/引用/ Global_Objects/Object/keys)..'與for ... in循環提供的順序相同 - - 'for..in語句以任意順序迭代對象的可枚舉屬性,' –

+0

[Spec] (http://www.ecma-international.org/ecma-262/5.1/#sec-15.2.3.14) - '如果一個實現爲for-in語句定義了特定的枚舉順序,那麼相同的枚舉順序必須是用於此算法的第5步.' - 訂單是可選的 –

回答

2

ECMA-262, section 12.6.4關於換在語句:

的力學和列舉的屬性順序(步驟6.A在第一算法,在第二步驟7.A)沒有被指定。

你可以使用數組來代替:

var opts = [ 
    {key: 'all', value: 'All'}, 
    {key: 0,  value: 'Some option'}, 
    {key: 1,  value: 'Cookies'} 
]; 

或者,在ES6的Map對象:

var opts = new Map([ 
    ['all', 'All'], 
    [0,  'Some option'], 
    [1,  'Cookies'] 
]); 

opts.forEach(function(val, key) { 
    console.log(key, val); 
}); 

在這種情況下,forEach總是在插入順序迭代鍵 - 值對。

+0

謝謝,可能最終會這樣做。 「地圖」也很整潔! – user4947695