如何筛选同emp_id下edu_end_year最接近当前日期的对象数组
按emp_id筛选最接近当前日期的教育记录
我懂你要实现的效果——给每个员工保留他们最晚结束的那条教育记录对吧?用filter()和find()确实不太好直接处理这种分组+取最大值的需求,这里推荐用Array.reduce()来搞定,它能高效完成分组和筛选的工作。
解决方案代码
const educations = [ { "emp_id": 1, "edu_degree": "SMA", "edu_end_year": 2011 }, { "emp_id": 1, "edu_degree": "S1", "edu_end_year": 2016 }, { "emp_id": 2, "edu_degree": "S1", "edu_end_year": 2016 } ]; const latestEducations = Object.values(educations.reduce((acc, curr) => { // 检查当前员工是否已在累加器中,或当前记录的结束年份更晚 if (!acc[curr.emp_id] || curr.edu_end_year > acc[curr.emp_id].edu_end_year) { acc[curr.emp_id] = curr; } return acc; }, {})); console.log(latestEducations);
代码逻辑说明
- 分组遍历:用
reduce()遍历所有教育记录,构建一个以emp_id为键的临时对象,每个键对应该员工目前找到的最晚结束的教育记录。 - 筛选更新:每遍历一条记录,就对比它和临时对象中同
emp_id记录的edu_end_year——如果临时对象里还没有该员工的记录,或者当前记录的年份更大(更接近当前日期),就替换成当前记录。 - 转换结果:最后用
Object.values()把临时对象转成数组,就是我们需要的最终结果。
兼容字符串类型年份
如果你的edu_end_year是字符串类型(比如"2016"),只需要在比较时转成数字即可:
if (!acc[curr.emp_id] || Number(curr.edu_end_year) > Number(acc[curr.emp_id].edu_end_year)) { acc[curr.emp_id] = curr; }
内容的提问来源于stack exchange,提问作者user18605090
相关产品推荐
相关产品推荐

