搜尋

首頁  >  問答  >  主體

按小數鍵對JavaScript映射進行排序

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

全部回覆(1)我來回復

  • P粉501683874

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

    回覆
    0
  • 取消回覆