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

如何结合Lodash特性生成分组后仅含最新元素的新数组?

使用Lodash实现按name分组并保留最新时间戳元素的方案

刚好之前处理过类似的需求,用Lodash的几个方法组合起来就能轻松搞定。先把你的需求再明确下:

原始数组:

const originalArray = [
  { "id": "001", "name": "A", "timestamp_created": "2019-02-27T11:22:19" },
  { "id": "002", "name": "A", "timestamp_created": "2019-02-27T11:30:19" },
  { "id": "003", "name": "B", "timestamp_created": "2019-02-27T10:15:19" },
  { "id": "004", "name": "B", "timestamp_created": "2019-02-27T11:05:19" }
];

预期结果:

[
  { "id": "002", "name": "A", "timestamp_created": "2019-02-27T11:30:19" },
  { "id": "004", "name": "B", "timestamp_created": "2019-02-27T11:05:19" }
]

下面给你三种不同的实现思路,都是基于Lodash特性组合的:

方法一:分组后取每组最新元素(直观易读)

用_.groupBy先按name分组,再用_.map遍历每组,最后用_.maxBy选出时间戳最新的元素:

const _ = require('lodash');

const result = _.map(_.groupBy(originalArray, 'name'), group => 
  _.maxBy(group, item => new Date(item.timestamp_created))
);

console.log(result);
  • _.groupBy:将原始数组按name字段拆分,得到一个键为A、B,值为对应元素数组的对象。
  • _.map:遍历分组后的对象,对每个分组数组做处理。
  • _.maxBy:把每个元素的timestamp_created转为Date对象,以此为依据选出分组里最大(最新)的元素。

方法二:单次遍历累加(性能最优)

如果你的数组数据量很大,这种一次遍历的方式更高效,不需要额外的分组步骤:

const _ = require('lodash');

const result = _.reduce(originalArray, (acc, current) => {
  const existingItem = acc.find(item => item.name === current.name);
  if (!existingItem) {
    // 累加器里还没有这个name的元素,直接加入
    acc.push(current);
  } else {
    // 比较时间戳,保留更新的那个元素
    if (_.isAfter(new Date(current.timestamp_created), new Date(existingItem.timestamp_created))) {
      acc[acc.indexOf(existingItem)] = current;
    }
  }
  return acc;
}, []);

console.log(result);
  • _.reduce:从头遍历原始数组,用累加器acc存储最终结果。
  • _.isAfter:Lodash提供的日期比较方法,比手动写Date对比更简洁可靠。

方法三:排序后去重(代码最简洁)

先按name分组、时间戳降序排序,再按name去重,只保留每个name的第一个(最新)元素:

const _ = require('lodash');

const result = _.uniqBy(
  _.orderBy(originalArray, ['name', 'timestamp_created'], ['asc', 'desc']),
  'name'
);

console.log(result);
  • _.orderBy:先按name升序排列,再按timestamp_created降序排列,这样每个name的最新元素会排在该组的最前面。
  • _.uniqBy:按name字段去重,自动保留每个name的第一个元素,也就是我们要的最新元素。

这三种方法都能得到你预期的结果,可以根据自己的场景选择:追求可读性选方法一,追求性能选方法二,追求代码简洁选方法三。

内容的提问来源于stack exchange,提问作者Phong Vu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 03:57:25