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

如何删除对象数组中基于多属性的重复项并保留首个实例?

删除对象数组中多属性重复项的实现思路

问题描述

需要删除对象数组中的重复项,判断重复的标准是name、lastName、city三个属性的取值完全一致,仅保留数组中首次出现的实例。示例如下:

输入数组

const input = [
  {
    "eventUid": "0fdb73d9-629f-4151-acab-7b48c24ef2D0",
    "name": "John",
    "lastName": "Doe",
    "city": "Ukraine"
  },
  {
    "eventUid": "0fdb73d9-629f-4151-aBab-7b48c24ef2e0",
    "name": "Marcel",
    "lastName": "Pilate",
    "city": "Ukraine"
  },
  {
    "eventUid": "0fcc73d9-629f-4151-aBab-7b48c24ef2e0",
    "name": "John",
    "lastName": "Doe",
    "city": "Ukraine"
  }
];

预期输出

const output = [
  {
    "eventUid": "0fdb73d9-629f-4151-acab-7b48c24ef2D0",
    "name": "John",
    "lastName": "Doe",
    "city": "Ukraine"
  },
  {
    "eventUid": "0fdb73d9-629f-4151-aBab-7b48c24ef2e0",
    "name": "Marcel",
    "lastName": "Pilate",
    "city": "Ukraine"
  }
];

实现思路与代码

核心逻辑是通过一个容器记录已出现过的属性组合,遍历数组时仅保留首次出现的对象:

方法1:Array.reduce + Set 组合

利用reduce遍历数组,同时用Set存储目标属性生成的唯一标识,确保每个属性组合只保留第一个出现的对象:

const uniqueArray = input.reduce((acc, current) => {
  // 生成唯一标识:若属性值含特殊字符,建议用JSON序列化避免冲突
  const key = JSON.stringify({
    name: current.name,
    lastName: current.lastName,
    city: current.city
  });
  
  if (!acc.seen.has(key)) {
    acc.seen.add(key);
    acc.result.push(current);
  }
  return acc;
}, { seen: new Set(), result: [] }).result;

console.log(uniqueArray);

方法2:forEach + Set 手动维护

逻辑与上述一致,用forEach遍历数组,手动管理结果数组和已见标识集合:

const seen = new Set();
const uniqueArray = [];

input.forEach(item => {
  const key = `${item.name}-${item.lastName}-${item.city}`;
  if (!seen.has(key)) {
    seen.add(key);
    uniqueArray.push(item);
  }
});

console.log(uniqueArray);

注意事项

  • 若属性值可能包含分隔符(如-),优先用JSON.stringify序列化属性对象生成唯一标识,避免拼接后的字符串出现冲突。
  • 两种方法时间复杂度均为O(n),遍历一次即可完成去重,效率较高。

内容的提问来源于stack exchange,提问作者alainber82

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 04:41:06