JavaScript中按员工姓名从对象数组查找最大日期并添加标记
按员工分组并标记最新日期记录的解决方案
我来帮你搞定这个需求!要实现按emp_name分组,给每组date最大的记录添加max:true标记,可以通过以下两步轻松实现:
1. 先收集每个员工的最新日期
首先我们遍历一次数组,用一个对象存储每个员工对应的最大日期,这样后续就能快速对比判断:
let arr_of_obj = [{emp_name:'Mark',date:new Date('2018/05/01')}, {emp_name:'Mark',date:new Date('2018/05/02')}, {emp_name:'John',date:new Date('2018/04/05')}, {emp_name:'John',date:new Date('2018/03/22')}, {emp_name:'Mark',date:new Date('2018/05/06')}]; // 存储每个员工的最大日期 const maxDateMap = {}; arr_of_obj.forEach(item => { const empName = item.emp_name; // 如果该员工还没记录,或者当前日期比已存的更大,就更新 if (!maxDateMap[empName] || item.date > maxDateMap[empName]) { maxDateMap[empName] = item.date; } });
2. 遍历原数组添加标记
接下来再次遍历数组,对比每个记录的日期和maxDateMap中对应员工的最大日期,匹配的话就添加max: true标记:
// 生成最终结果数组 const updatedArr = arr_of_obj.map(item => { // 用getTime()比较时间戳,避免Date对象引用不同导致的判断错误 if (item.date.getTime() === maxDateMap[item.emp_name].getTime()) { return {...item, max: true}; // 复制原对象并添加标记,不修改原对象 } return item; }); console.log(updatedArr);
为什么要用getTime()?
因为两个内容相同的Date对象是不同的引用,直接用===比较会返回false,而时间戳是数字,比较起来更准确可靠。
运行结果
执行后你会得到符合预期的数组:
[ { emp_name: 'Mark', date: 2018-04-30T16:00:00.000Z }, { emp_name: 'Mark', date: 2018-05-01T16:00:00.000Z }, { emp_name: 'John', date: 2018-04-04T16:00:00.000Z, max: true }, { emp_name: 'John', date: 2018-03-21T16:00:00.000Z }, { emp_name: 'Mark', date: 2018-05-05T16:00:00.000Z, max: true } ]
这个方案的时间复杂度是O(n),只需要两次遍历数组,处理大数据量也很高效~
内容的提问来源于stack exchange,提问作者jasmeetsohal
相关产品推荐
相关产品推荐

