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

JS如何仅删除数组中同ID重复对象的单个实例

filter会把所有满足过滤条件的项都排除,如果你写的过滤逻辑是item.id !== 目标id,那所有id匹配的对象都会被删掉,自然会把同id的项全清掉。要只删单个同id对象,核心是只排除你要删的那一个匹配项,剩下的同id项全部保留。

实现方案

方案1:标记位+filter(无需提前找索引)

如果要删除第一个匹配目标ID的对象,加一个删除标记位即可,匹配到第一个目标项后标记为已删除,后续同ID项不再排除:

const arr = [
  {id: 12, selected: true},
  {id: 12, selected: true}
]
const targetDeleteId = 12
let isDeleted = false

const newArr = arr.filter(item => {
  // 第一次匹配到目标ID且还没删过的时候,排除当前项、标记已删除
  if (item.id === targetDeleteId && !isDeleted) {
    isDeleted = true
    return false
  }
  return true
})

执行后newArr里只会保留1个id为12的对象,实现单条删除。

方案2:定位索引后拼接数组(性能更高)

如果你能明确要删除的对象在数组中的索引,直接切割数组拼接即可,不需要遍历全数组:

// 比如要删除索引为0的那项
const deleteIndex = 0
const newArr = [...arr.slice(0, deleteIndex), ...arr.slice(deleteIndex + 1)]

如果要删除最后一个匹配ID的对象,可以先用findLastIndex拿到对应索引再切割:

const targetDeleteId = 12
const lastMatchIndex = arr.findLastIndex(item => item.id === targetDeleteId)
const newArr = lastMatchIndex > -1 
  ? [...arr.slice(0, lastMatchIndex), ...arr.slice(lastMatchIndex + 1)]
  : [...arr]
注意事项

如果你的数组里同ID对象没有其他唯一标识(比如示例里两个对象属性完全一致),删除前要明确你要删除的是第几个匹配项,避免删错目标。如果业务允许,最好给每个对象加全局唯一的主键,删除时直接按唯一主键过滤,就不会出现误删的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 01:21:21