JS多维对象数组保留所有子数组共有元素的精简实现需求
JavaScript 多维对象数组提取跨子数组公共元素精简方案
实现思路
- 先统计所有对象的唯一标识
employee_number在全量数据中的出现次数 - 出现次数等于子数组总数量的标识就是所有子数组共有的元素标识
- 按标识过滤原数组即可得到目标结果
代码实现
假设你的输入结构参考如下:
// 输入示例,子数组数量可任意调整 const sourceArr = [ [{employee_number: 1, name: '张三'}, {employee_number: 2}, {employee_number: 5}, {employee_number: 6}], [{employee_number: 1, name: '张三'}, {employee_number: 4}, {employee_number: 5}, {employee_number: 6}], [{employee_number: 1, name: '张三'}, {employee_number: 7}, {employee_number: 5}, {employee_number: 6}] ]
场景1:只需要拿到公共对象的一维数组
const countMap = sourceArr.flat().reduce((map, item) => ( map.set(item.employee_number, (map.get(item.employee_number) || 0) + 1), map ), new Map()) const commonItems = sourceArr[0].filter(item => countMap.get(item.employee_number) === sourceArr.length)
场景2:需要保留原多维数组结构,仅删除每个子数组里的非公共对象
const countMap = sourceArr.flat().reduce((map, item) => ( map.set(item.employee_number, (map.get(item.employee_number) || 0) + 1), map ), new Map()) const commonEmpNos = [...countMap].filter(([_, count]) => count === sourceArr.length).map(([no]) => no) const result = sourceArr.map(subArr => subArr.filter(item => commonEmpNos.includes(item.employee_number)))
说明
- 用
Map存储计数比普通对象性能更好,尤其数据量大的时候查询效率更高 - 所有逻辑用原生数组API链式调用,无冗余变量,代码量精简
内容的提问来源于stack exchange,提问作者vinuta
相关产品推荐
相关产品推荐

