簡體   English   中英

如何對鍵是數字字符串的數組進行排序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM