如何合并对象数组中的所有子数组并提取唯一值?
提取数组对象中唯一的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
相关产品推荐
相关产品推荐

