如何按月份(唯一键)将日期分组为对应数组?
问题:按月份分组日期时仅保留每个月最后一条数据
我有如下带序号的日期数据,需要按月份将日期分组为对应数组:
1 => Thu Feb 16 2023 1 => Fri Feb 17 2023 1 => Sat Feb 18 2023 1 => Sun Feb 19 2023 1 => Mon Feb 20 2023 1 => Tue Feb 21 2023 1 => Wed Feb 22 2023 1 => Thu Feb 23 2023 1 => Fri Feb 24 2023 1 => Sat Feb 25 2023 1 => Sun Feb 26 2023 1 => Mon Feb 27 2023 1 => Tue Feb 28 2023 2 => Wed Mar 01 2023 2 => Thu Mar 02 2023 2 => Fri Mar 03 2023
期望得到的分组格式:
1 => [Fri Feb 17 2023, Sat Feb 18 2023, ...], 2 => [Wed Mar 01 2023, Thu Mar 02 2023, ...]
我的代码如下:
let dts = {}; newDates.forEach((dt, i) => { let mn = new Date(dt).getMonth(); dts[mn] = dt; }); console.log(dts);
但运行后仅得到每个月份的最后一个日期:
1 : Tue Feb 28 2023 2 : Fri Mar 03 2023
请问该如何解决这个问题?
解决方案
问题出在每次循环直接覆盖了对应月份的取值:dts[mn] = dt会把当前月份对应的键值替换成最新的dt,所以最后只保留了每个月的最后一条数据。
要实现分组数组,需要先判断当前月份的键是否已存在数组,不存在则初始化空数组,再将日期推入数组:
修正后的代码:
let dts = {}; newDates.forEach((dt) => { let mn = new Date(dt).getMonth(); // 若当前月份未初始化数组,先创建空数组 if (!dts[mn]) { dts[mn] = []; } // 将当前日期推入对应月份的数组 dts[mn].push(dt); }); console.log(dts);
运行后会得到期望的分组结果:
1: [ "Thu Feb 16 2023", "Fri Feb 17 2023", ..., "Tue Feb 28 2023" ], 2: [ "Wed Mar 01 2023", "Thu Mar 02 2023", "Fri Mar 03 2023" ]
内容的提问来源于stack exchange,提问作者PNG
相关产品推荐
相关产品推荐

