按小數鍵對JavaScript映射進行排序
P粉755863750
P粉755863750 2023-09-19 14:44:41
0
1
636

我有一個鍵為月份的地圖,鍵值為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粉755863750
P粉755863750

全部回覆(1)
P粉501683874

儘管在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()物件不太相容 - 請在開發工具控制台中檢查輸出以查看排序是否正確。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板