如何查找JavaScript同一数组中的对象重复项并按规则移除
数组对象去重及特定条件移除方案
1. 完全重复对象的去重实现
如果数组中的对象都是简单基础类型属性(无嵌套对象、函数、循环引用),可以通过序列化对象生成唯一标识,配合Set做去重判断:
const arr = [ {name: 'xyz', age: 13,}, {name: 'abc', age: 15,}, {name: 'abc', age: 15,} ]; const existed = new Set() const uniqueArr = arr.filter(item => { // 先排序对象属性再序列化,避免属性顺序不同导致判定为非重复 const key = JSON.stringify(Object.keys(item).sort().reduce((res, k) => { res[k] = item[k] return res }, {})) if (!existed.has(key)) { existed.add(key) return true } return false }) // 输出结果:[ { name: 'xyz', age: 13 }, { name: 'abc', age: 15 } ]
如果是包含复杂属性的对象,替换上述生成唯一key的逻辑为自定义深度对象比较方法即可。
2. 指定key重复时移除特定对象的实现
该需求可以实现,核心逻辑是先统计目标key的出现次数,再按照自定义规则过滤:
const arr = [ {name: 'xyz', entry: 1, age: 13,}, {name: 'abc', entry: 2, age: 15,}, {name: 'def', age: 13, entry: 3} ]; // 第一步:统计age字段的出现频次 const ageCount = arr.reduce((count, item) => { count[item.age] = (count[item.age] || 0) + 1 return count }, {}) // 第二步:按规则过滤:age重复时移除name为def的对象 const filteredArr = arr.filter(item => { // 对应age无重复直接保留 if (ageCount[item.age] <= 1) return true // age重复时,排除name为def的对象 return item.name !== 'def' }) // 输出结果:[ { name: 'xyz', entry: 1, age: 13 }, { name: 'abc', entry: 2, age: 15 } ]
如果要调整规则,只需修改统计的目标key、以及filter中的判定条件即可适配不同场景。
内容的提问来源于stack exchange,提问作者bugbytes
相关产品推荐
相关产品推荐

