搜索

首页  >  问答  >  正文

按小数键对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粉755863750431 天前639

全部回复(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
  • 取消回复