我有一個鍵為月份的地圖,鍵值為1
... 31
。如果我理解正確的話,JavaScript會將地圖的鍵轉換為字串。
使用標準的new Map([...myMap.entries()].sort())
進行排序後,地圖按鍵排序如下:
1, 11, 12, 13, ..., 19, 2, 20, 21, 22, 23, ... 29, 3, 30, 31.
我找到了一種將十進制鍵轉換為字串並用0
填充單一數字的方法,以實現1,2,3,4,5, ...
的排序:
mykey.toString().padStart(2, "0");
我懷疑這種方法太人為了,應該有一些預先建立的JavaScript方法可以透過鍵的十進制值來實現正常的地圖排序。
有沒有建議如何以更好的方式按十進位鍵對JavaScript地圖進行排序?
嘗試了new Map([...myMap.entries()].sort())
- 地圖被排序為:1, 11, 12, ..., 19, 2, 20 , 21, 22, ... 29, 3, 30, 31。
P粉5016838742023-09-20 12:24:53
儘管在Map()
物件的key
中可以使用任何類型,但在使用預設的sort()
實作時,它們會被強制轉換為字串。
要解決這個問題,您需要實作自己的排序邏輯,明確地將它們作為數值進行比較。在下面的範例中,它使用整數,但如果需要進行小數比較,可以輕鬆地更新為使用parseFloat()
。
const map = new Map(); map.set(3, "foo"); map.set(1, "foo"); map.set(8, "foo"); map.set(10, "foo"); map.set(5, "foo"); map.set(2, "foo"); map.set(4, "foo"); map.set(7, "foo"); map.set(6, "foo"); map.set(9, "foo"); // does not work: const mapFailedSort = new Map([...map.entries()].sort()); console.log(mapFailedSort); // works: const mapAsc = new Map([...map.entries()].sort((a, b) => +a[0] > +b[0] ? 1 : -1)); console.log(mapAsc)
注意:程式碼片段控制台似乎與Map()
物件不太相容 - 請在開發工具控制台中檢查輸出以查看排序是否正確。