如何使用Moment.js将含日期属性的对象数组按本周/上周分组?
将对象数组按本周/上周记录分组(JavaScript + Moment.js)
刚好我之前处理过类似的需求,用Moment.js来做这个分组非常顺手,我来给你一步步拆解实现方式:
首先先确认你的数据集:
const obj = [{ first_name: "Peter", last_name: "Hansen", date: "2018-01-01" }, { first_name: "Jonas", last_name:"Da Vinci", date: "2018-01-02" }, { first_name: "Ohmel", last_name: "Reynolds", date: "2018-01-03" }, { first_name: "Raisa", last_name: "Johnson", date: "2017-12-25" }, { first_name: "Karen", last_name: "Anderson", date: "2017-12-26" }, { first_name: "Kristina", last_name: "Alvaro", date: "2017-12-27" }];
核心实现代码
我们可以利用Moment.js的isSameWeek方法来快速判断日期所属的周,再遍历数组完成分组:
// 初始化分组容器 const groupedRecords = { thisWeek: [], lastWeek: [] }; // 获取当前日期的moment实例 const currentDate = moment(); obj.forEach(record => { // 将记录中的日期转为moment对象 const recordDate = moment(record.date); // 判断是否属于本周 if (recordDate.isSameWeek(currentDate)) { groupedRecords.thisWeek.push(`${record.first_name} ${record.last_name}`); } // 判断是否属于上周 else if (recordDate.isSameWeek(currentDate.clone().subtract(1, 'week'))) { groupedRecords.lastWeek.push(`${record.first_name} ${record.last_name}`); } // 可选:处理既不在本周也不在上周的记录 // else { // groupedRecords.otherWeeks.push(`${record.first_name} ${record.last_name}`); // } }); // 输出分组结果 console.log('This Week'); groupedRecords.thisWeek.forEach(name => console.log(name)); console.log('\nLast Week'); groupedRecords.lastWeek.forEach(name => console.log(name));
关键细节说明
- 周起始日的调整:Moment.js默认以周日作为一周的第一天,如果你的业务场景需要以周一为起始,可以给
isSameWeek方法传入第二个参数'isoWeek',比如:recordDate.isSameWeek(currentDate, 'isoWeek') - 日期克隆的重要性:使用
currentDate.clone().subtract(1, 'week')而不是直接currentDate.subtract(1, 'week'),是为了避免修改原有的currentDate实例,防止后续判断出错。 - 扩展处理:如果有超出两周范围的记录,可以添加额外的分组来存放,代码里已经留了注释示例。
预期输出
运行上述代码后,你会得到符合需求的输出:
This Week Peter Hansen Jonas Da Vinci Ohmel Reynolds Last Week Raisa Johnson Karen Anderson Kristina Alvaro
内容的提问来源于stack exchange,提问作者ddignadice
相关产品推荐
相关产品推荐

