[英]How to sort an array where the keys are numeric strings
我需要創建一個 Object ,其中鍵是由數字組成的字符串,但我無法以正確的方式對它們進行排序:
let simple_arr = ['00', '11', '22', '33']; let simple_obj = {}; for (let it of simple_arr) { simple_obj[it] = "anything"; } for (let it2 in simple_obj) { console.log(it2) }
我想要的 output 是:00、11、22、33。
但它重現:11、22、33、00。
我已經嘗試用 Object.keys 對這個 object 進行排序,但是當我在它上面設置一個迭代器時,值“00”總是到最后。
您不能依賴您說過要使用for-in
循環的 output。 盡管 object 屬性在 ES2015 中具有順序,但for-in
循環沒有。 ( Object.keys
中的數組也沒有。)
如果你想要訂單,你想要一個數組。 (但在某些情況下,您也可以使用Map
;見下文。)
此外,即使使用 ES2015 的屬性順序,您顯示的鍵也永遠不會按照您顯示的順序,因為'00'
與'11'
、 '22'
和'33'
不同:它不是規范數字字符串。 ES2015 順序(對於支持它的操作)是名稱為規范數字字符串格式的字符串的屬性,按數字順序排列,然后是其他以字符串命名的屬性(按照它們添加的順序),然后是符號命名的屬性。
因此,您的 object 永遠不會像您所說的那樣運行。 使用數組。
(當然,如果您引入一個前綴,因此它們都不是規范數字字符串格式並按您想要的順序添加屬性,這將與Object.getOwnPropertyNames
和其他支持該順序的操作一起使用。但我真的不會不要那樣做。)
另一種選擇是使用Map
,與對象不同,它始終遵循密鑰首次使用的順序。¹如果您像這樣創建Map
:
const map = new Map(simple_arr.map(key => [key, "anything"]));
...然后循環通過該 map 將可靠地訪問'00'
條目,然后是'11'
條目,然后是'22'
條目,然后是'33'
條目:
const simple_arr = ['00', '11', '22', '33']; const map = new Map(simple_arr.map(key => [key, "anything"])); for (const [key, value] of map.entries()) { console.log(key, value); }
¹這是簡單的版本。 更長的版本:如果您將鍵/值添加到 map 並且該鍵不在 map 中,則它位於地圖鍵列表的末尾。 如果您為該鍵設置了一個新值,它不會在該列表中移動。 如果您刪除密鑰,然后再添加它,它會再次出現在最后。
當涉及到它們的鍵時,對象沒有排序的概念。 即使您可以在特定瀏覽器中使用此特定數據集實現此目的,也不能保證密鑰會按照您想要的順序出現。
如果你真的想實現這一點,你應該對從Object.keys()
返回的鍵進行排序並對其進行迭代。
我上面的原始答案是不正確的。 從 ES2015 開始,object 密鑰確實有特定的順序。 我仍然認為,嘗試依賴 object 的鍵順序可能是個壞主意 - 使用 Map 保留鍵的原始值(而不會將它們強制為字符串)並在迭代時對鍵進行排序。
由於 ES2015 object 鍵確實有遍歷順序:
將00
轉換為0
,使其按數值排序:
const simple_arr = ['0', '11', '22', '33']; const simple_obj = {}; for(let it of simple_arr){ simple_obj[it] = "anything"; } for(let it2 in simple_obj){ console.log(it2) }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.