You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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}]。


实现思路

  1. 生成唯一标识键:针对每条记录,根据uniqueKey的字段路径拼接出一个能代表唯一性的字符串,比如把rollNo和stDetails.city的值用分隔符连接。
  2. 统计出现次数:用Map统计每个唯一标识的出现次数,判断哪些组合是重复的。
  3. 筛选重复记录:再次遍历数组,用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 16:42:51