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

如何查找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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 15:06:00