如何删除对象数组中基于多属性的重复项并保留首个实例?
删除对象数组中多属性重复项的实现思路
问题描述
需要删除对象数组中的重复项,判断重复的标准是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
相关产品推荐
相关产品推荐

