You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:27:29