从含数百对象的数组中提取去重后的responsable对象数组
提取并去重数组中的
responsable子对象 没问题,这个需求非常常见,咱们分两步就能轻松搞定——先把所有responsable子对象提取出来,再基于唯一标识完成去重操作。下面是具体的实现方案:
核心实现代码
假设你的原数组名为originalArray,我们可以用JavaScript的数组方法链式调用完成操作:
// 提取并去重,以id作为唯一标识 const uniqueResponsables = Object.values( originalArray // 第一步:提取所有responsable子对象 .map(item => item.responsable) // 可选:过滤掉可能存在的null/undefined的responsable .filter(Boolean) // 第二步:用reduce合并相同id的对象,保留最后一个出现的 .reduce((accumulator, current) => { accumulator[current.id] = current; return accumulator; }, {}) );
代码细节解释
map提取子对象:遍历原数组,把每个元素里的responsable子对象单独拎出来,得到一个只包含responsable的数组。filter(Boolean)(可选):如果原数组里存在某些元素的responsable是null或undefined,这一步能把这些无效项过滤掉,避免后续操作出错。reduce实现去重:通过将数组转换为以id为键的对象,利用对象键的唯一性自动去重——相同id的对象会被后面的覆盖(如果原数组里有重复项)。最后用Object.values()把对象的值转换回数组,就得到了去重后的结果。
自定义去重依据
如果你的去重标识不是id,而是其他字段(比如username,或者nombre+apellido1的组合),只需要修改reduce里的键即可:
// 示例:以username作为去重标识 const uniqueResponsables = Object.values( originalArray .map(item => item.responsable) .filter(Boolean) .reduce((acc, curr) => { acc[curr.username] = curr; return acc; }, {}) ); // 示例:以nombre+apellido1+apellido2组合作为去重标识 const uniqueResponsables = Object.values( originalArray .map(item => item.responsable) .filter(Boolean) .reduce((acc, curr) => { const key = `${curr.nombre}-${curr.apellido1}-${curr.apellido2}`; acc[key] = curr; return acc; }, {}) );
内容的提问来源于stack exchange,提问作者Jose
相关产品推荐
相关产品推荐

