按十进制键对JavaScriptMap排序

plicqrtu  于 2023-08-02  发布在  Java
关注(0)|答案(1)|浏览(79)

我有一张Map,钥匙=一个月中的一天,1... 31。如果我理解正确的话,JavaScript会将Map键转换为字符串。
使用标准new Map([...myMap.entries()].sort())排序后,Map将按键排序为:

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的方法来实现正常排序的一个Map由一个十进制值的键。
有什么建议可以更好地按小数键对JavaScript map排序吗?
尝试了new Map([... myMap.entries()].sort())-Map被排序为:1、11、12、……、19、2、20、21、22、……二十九三三十三十一

kgqe7b3p

kgqe7b3p1#

虽然任何类型都可以在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()对象-检查devtools控制台中的输出以查看排序是否正确。

相关问题