JavaScript中如何对以日期为键的Map进行排序?
解决JavaScript Map按日期键排序的问题
嘿,我来帮你搞定这个Map排序的问题!你之前的代码思路方向是对的,但在sort回调函数的参数处理上出了点小问题,咱们一步步来修正。
问题出在哪?
你写的sort(function(key, value) { return new Date(key); })里,key和value其实是[...days_map]数组里的整个键值对元素(也就是[日期字符串, 对应对象]这样的数组),而不是Map的键和值。直接把这个数组传给new Date()肯定得不到正确的日期比较结果,自然排不对序。
正确的实现思路
ES6的Map是有序集合,它会按照元素的插入顺序保存内容。所以我们只需要:
- 把Map转换成键值对数组(
[...days_map]就能做到) - 对这个数组按日期键进行排序
- 用排序后的数组重新创建一个新的Map
完整代码示例
// 先还原你的示例Map const days_map = new Map([ ['2020-09-29', { foo: 1, bar: 2 }], ['2020-09-01', { foo: 3, bar: 4 }], ['2020-09-08', { foo: 5, bar: 6 }] ]); // 按日期升序排序(如果要降序,把new Date(dateA)和new Date(dateB)调换位置) const sortedDaysMap = new Map( [...days_map].sort(([dateA], [dateB]) => new Date(dateA) - new Date(dateB)) ); // 验证排序结果 for (const [key, value] of sortedDaysMap) { console.log(key, value); } // 输出顺序: // 2020-09-01 { foo: 3, bar: 4 } // 2020-09-08 { foo: 5, bar: 6 } // 2020-09-29 { foo: 1, bar: 2 }
代码解释
[...days_map]:将Map展开成一个二维数组,每个元素是[键, 值]的形式sort(([dateA], [dateB]) => ...):用数组解构直接取出每个元素里的日期键,转换成Date对象后相减——日期对象相减会返回时间戳的差值,正数表示dateA比dateB晚,负数则相反,这样就能实现升序排序- 最后用排序后的数组创建新Map,就得到了按日期排序的有序Map啦
内容的提问来源于stack exchange,提问作者Maxi
相关产品推荐
相关产品推荐

