如何去除嵌套对象数组重复项 保留每个field下首个key条目
嵌套结构对象数组去重实现方案
去重规则:按field字段分组,每组内value对象下的每个键仅保留第一次出现的条目,后续重复键对应的条目直接过滤
实现思路
- 遍历原数组时,用
Set结构记录已经留存过的「field值 + value下的键名」组合,避免重复留存 - 示例数据中每个条目的
value对象仅包含1个键,直接通过Object.keys(item.value)[0]即可获取当前条目的value键名 - 遍历过程中如果当前条目的组合未被记录,就保留该条目并将组合加入Set;如果已被记录则过滤掉该条目
可运行代码
// 原始数组(已修正原数据里的中文引号为标准英文引号,保证语法可执行) const rawList = [ { field: 'A', value: { key_A: ['ajd', 'ajd', 'kajd'], }, }, { field: 'A', value: { key_B: ['123', '4', '45', '94'], }, }, { field: 'A', value: { key_A: ['ajd', 'ajd', ''], }, }, { field: 'A', value: { key_B: ['123', '4', '45'], }, }, { field: 'Z', value: { key_A: ['ajdm', 'askjd', 'kajd'], }, }, { field: 'Z', value: { key_B: ['13', '123', '1823'], }, }, { field: 'Z', value: { key_A: ['ajdm', 'askjd', ''], }, }, { field: 'Z', value: { key_B: ['13', '123', ''], }, }, ]; // 核心去重逻辑 const existedKeys = new Set(); const dedupedList = rawList.filter(item => { const valueKey = Object.keys(item.value)[0]; // 加分隔符避免field和valueKey拼接时出现字符串冲突导致误判 const uniqueMark = `${item.field}__${valueKey}`; if (!existedKeys.has(uniqueMark)) { existedKeys.add(uniqueMark); return true; } return false; });
运行结果
执行代码后得到的输出和预期完全一致:
[ { field: 'A', value: { key_A: ['ajd', 'ajd', 'kajd'] } }, { field: 'A', value: { key_B: ['123', '4', '45', '94'] } }, { field: 'Z', value: { key_A: ['ajdm', 'askjd', 'kajd'] } }, { field: 'Z', value: { key_B: ['13', '123', '1823'] } } ]
补充说明
- 采用
Set做已存在记录的存储,查询和写入性能均为O(1),相比数组存储+includes判断的方案在数据量较大时性能优势明显 - 生成唯一标识的分隔符可根据自身业务的字段命名规则调整,只要能避免拼接冲突即可
- 如果实际业务中单个条目的
value下存在多个键,只需将取单个valueKey的逻辑调整为遍历value的所有键,判断是否存在未留存的键即可,核心逻辑不变
内容的提问来源于stack exchange,提问作者Bishal Jain
相关产品推荐
相关产品推荐

