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
相关产品推荐
相关产品推荐

