JavaScript中按指定键校验,获取对象数组重复项的id
按指定嵌套键筛选重复记录的ID
给定如下JavaScript数据和指定的唯一键规则:
let input = [ { id: 1, rollNo: 5, Name: "A", stDetails: { city: "city1", pin: 1234, }, }, { id: 2, rollNo: 5, Name: "B", stDetails: { city: "city1", pin: 1234, }, }, { id: 3, rollNo: 5, Name: "C", stDetails: { city: "city1", pin: 1234, }, }, { id: 4, rollNo: 5, Name: "D", stDetails: { city: "city1", pin: 1234, }, }, { id: 5, rollNo: 10, Name: "E", stDetails: { city: "city2", pin: 1234, }, }, ]; let uniqueKey = ["rollNo", "stDetails.city"];
需求是:按照uniqueKey里的字段(包含嵌套的stDetails.city)校验记录是否重复,找出所有出现次数超过1的重复记录的id(首次出现的记录不算重复项),预期输出为[{id:2},{id:3},{id:4}]。
实现思路
- 生成唯一标识键:针对每条记录,根据
uniqueKey的字段路径拼接出一个能代表唯一性的字符串,比如把rollNo和stDetails.city的值用分隔符连接。 - 统计出现次数:用
Map统计每个唯一标识的出现次数,判断哪些组合是重复的。 - 筛选重复记录:再次遍历数组,用
Set标记已见过的唯一标识,跳过首次出现的记录,后续出现的相同标识记录就收集其id。
完整代码
// 辅助函数:根据字段路径获取对象中的值 const getValueByPath = (obj, path) => { return path.split('.').reduce((current, key) => { return current ? current[key] : undefined; }, obj); }; // 统计每个唯一组合键的出现次数 const keyCount = new Map(); input.forEach(item => { const keyParts = uniqueKey.map(path => getValueByPath(item, path)); const uniqueStr = keyParts.join('|'); // 用|做分隔符,避免字段值自带符号干扰 keyCount.set(uniqueStr, (keyCount.get(uniqueStr) || 0) + 1); }); // 收集重复项的id(跳过首次出现的记录) const duplicateIds = []; const seenKeys = new Set(); input.forEach(item => { const keyParts = uniqueKey.map(path => getValueByPath(item, path)); const uniqueStr = keyParts.join('|'); if (keyCount.get(uniqueStr) > 1) { if (seenKeys.has(uniqueStr)) { duplicateIds.push({ id: item.id }); } else { seenKeys.add(uniqueStr); } } }); console.log(duplicateIds); // 输出 [{id:2},{id:3},{id:4}]
代码说明
getValueByPath:处理嵌套字段路径,比如stDetails.city,通过拆分路径字符串逐层访问对象属性,拿到对应的值。- 第一次遍历用
Map统计组合键的出现次数,快速定位哪些是重复的组合。 - 第二次遍历用
Set记录已处理过的组合键,确保只收集首次出现之后的重复记录,完全匹配预期输出要求。
内容的提问来源于stack exchange,提问作者user13000875
相关产品推荐
相关产品推荐

