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

如何从嵌套对象数组中提取ID唯一的对象并合并为单个数组?

解决嵌套对象数组提取唯一ID对象的问题

嘿,我明白你的问题啦!你之前的Lodash代码没达到预期,核心原因是**_.union()没法直接处理嵌套的二维数组**——它会把每个子数组当作独立元素,而不是展开里面的对象,后续的uniqBy自然没法正确去重。

正确的Lodash解决方案

先把嵌套数组扁平化成一维数组,再根据id去重就可以了:

const data = [ 
  [ {id:1, name:'xxx'} ], 
  [ {id:2, name:'xxx'}, {id:1, name:'xxx'} ], 
  [ {id:2, name:'xxx'}, {id:1, name:'xxx'}, {id:3, name:'xxx'} ] 
];

// 链式调用写法
const uniqueObjects = _.chain(data)
  .flatten() // 将二维数组打平为一维,所有对象都在同一个数组里
  .uniqBy('id') // 根据id属性去重
  .value();

// 或者更简洁的非链式写法
const uniqueObjects = _.uniqBy(_.flatten(data), 'id');

console.log(uniqueObjects);
// 输出:[{id:1, name:'xxx'}, {id:2, name:'xxx'}, {id:3, name:'xxx'}]

原生JS替代方案(无需Lodash)

如果你不想依赖Lodash,用原生JS也能轻松实现:

const uniqueObjects = Array.from(
  // 先扁平化数组,再用Map以id为键存储对象(自动覆盖重复id)
  data.flat().reduce((map, obj) => map.set(obj.id, obj), new Map())
).map(([_, obj]) => obj);

为什么原来的代码失效?

你之前的_.(data).union().uniqBy(o => o.id).value()中:

  • _.union()处理的是外层数组的元素(也就是那些子数组),不会展开子数组里的对象;
  • 后续的uniqBy是在子数组层面去重,根本没接触到里面的对象,所以结果自然不对。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:07:54