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

如何合并对象数组中的所有子数组并提取唯一值?

提取数组对象中唯一的reference值(ES6实现)

嘿,我来帮你搞定这个问题!首先咱们先看看你之前代码的问题:你用references.concat(i.reference)的时候,concat方法不会修改原数组,而是返回一个新数组,所以你原来的references一直是空的,而且也没处理重复值。

下面给你几种简洁的ES6解决方案:

方法1:flatMap + Set(最简洁)

flatMap可以直接把所有嵌套的reference数组扁平成一个一维数组,再用Set去重,最后转成数组:

const items = [ { _id: '1', reference: ['abc'] }, { _id: '2', reference: ['def'] }, { _id: '3', reference: ['abc'] } ];
const uniqueReferences = Array.from(new Set(items.flatMap(item => item.reference)));
console.log(uniqueReferences); // 输出 ['abc', 'def']
  • flatMap(item => item.reference)会遍历每个对象,把每个reference数组展开,得到['abc', 'def', 'abc']
  • new Set(...)自动剔除重复值
  • Array.from()把Set转回数组(或者用扩展运算符[...new Set(...)]也可以)

方法2:reduce + Set(兼容性更好)

用reduce来合并所有reference数组,再去重:

const items = [ { _id: '1', reference: ['abc'] }, { _id: '2', reference: ['def'] }, { _id: '3', reference: ['abc'] } ];
// 先合并所有reference数组
const merged = items.reduce((acc, item) => acc.concat(item.reference), []);
// 去重
const uniqueReferences = [...new Set(merged)];
console.log(uniqueReferences); // 输出 ['abc', 'def']
  • reduce的初始值是空数组,每次迭代把当前对象的reference合并到累加器里,最终得到合并后的数组
  • [...new Set(merged)]用扩展运算符把Set转成数组,写法更简洁

如果你想修改原来的forEach代码

如果一定要用forEach,得改成这样(注意要展开数组再push,或者重新赋值concat的结果):

const items = [ { _id: '1', reference: ['abc'] }, { _id: '2', reference: ['def'] }, { _id: '3', reference: ['abc'] } ];
const references = [];
items.forEach(i => {
  // 用展开运算符把reference数组的元素逐个push进去
  references.push(...i.reference);
});
// 最后去重
const uniqueReferences = [...new Set(references)];
console.log(uniqueReferences); // 输出 ['abc', 'def']

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:51:46