如何从JavaScript数组中移除重复数据并仅保留非重复项
实现需求
从对象数组中移除所有存在重复的条目,仅保留从未重复出现过的元素。
测试数据
const array1 = [ {id:1 , name:"John" , age:20}, {id:2 , name:"Sam" , age:15}, {id:3 , name:"Paul" , age:28}, {id:4 , name:"David" , age:50}, {id:1 , name:"John" , age:20}, {id:4 , name:"David" , age:50} ]
预期输出:
[ {id:2 , name:"Sam" , age:15}, {id:3 , name:"Paul" , age:28} ]
实现方案
对象是引用类型,直接用===比较只能判断是不是同一个内存地址,没法判断内容是否重复,所以先把对象序列化成字符串作为唯一标识统计出现次数,再筛选出只出现过一次的条目即可:
const countMap = new Map() // 第一次遍历:统计每个对象的出现次数 array1.forEach(item => { const itemKey = JSON.stringify(item) countMap.set(itemKey, (countMap.get(itemKey) ?? 0) + 1) }) // 第二次遍历:筛出仅出现1次的条目 const uniqueOnlyArray = array1.filter(item => { return countMap.get(JSON.stringify(item)) === 1 })
这个方案的特点:
- 时间复杂度为O(n),仅需两次线性遍历,性能远高于嵌套比对的方案
- 无第三方依赖,原生JS即可直接运行
- 如果你的数据中对象属性顺序可能不一致,可以先对对象键做排序后再序列化生成key,避免内容相同但key字符串不同的判断误差
内容的提问来源于stack exchange,提问作者CHAINECS
相关产品推荐
相关产品推荐

