如何按id从对象数组中移除单个重复对象
移除数组中的一个重复对象
你的现有reduce代码存在多处错误:
- 参数顺序搞反了:
reduce的第一个参数是累加器,第二个是当前元素,不是val, index; - 错误访问了数组的
obj.id(数组本身没有这个属性),应该用当前元素的curr.id; o.name里的o未定义,正确写法是curr.name;- 没有返回累加器,逻辑上也无法生成目标数组。
下面是实现需求的具体方案:
目标效果
原数组:
let obj = [ { id: 1, name: 'A' }, { id: 1, name: 'A' }, { id: 1, name: 'A' }, { id: 2, name: 'A' }, { id: 2, name: 'A' } ]
点击按钮后,移除一个重复对象(比如3个id=1的对象减少为2个),得到:
[ { id: 1, name: 'A' }, { id: 1, name: 'A' }, { id: 2, name: 'A' }, { id: 2, name: 'A' } ]
实现代码
方案1:移除第一个出现的重复对象
思路:先统计每个id+name组合的出现次数,找到第一个重复的元素并移除:
// 点击按钮的处理函数 function removeOneDuplicate() { // 统计每个(id,name)组合的出现次数 const countMap = obj.reduce((acc, curr) => { const key = `${curr.id}-${curr.name}`; acc[key] = (acc[key] || 0) + 1; return acc; }, {}); // 找到第一个重复元素的索引 const removeIdx = obj.findIndex(item => { const key = `${item.id}-${item.name}`; return countMap[key] > 1; }); // 存在重复则移除 if (removeIdx !== -1) { // 直接修改原数组 obj.splice(removeIdx, 1); // 若不想修改原数组,用下面的方式生成新数组 // obj = [...obj.slice(0, removeIdx), ...obj.slice(removeIdx + 1)]; } } // 调用测试 removeOneDuplicate();
方案2:给每个重复组都移除一个元素
如果希望点击一次按钮,让所有重复组的元素数量都减一(比如3个变2个,2个变1个),可以用这个写法:
function removeOneFromEachGroup() { const countMap = {}; // 先统计所有组合的出现次数 obj.forEach(item => { const key = `${item.id}-${item.name}`; countMap[key] = (countMap[key] || 0) + 1; }); // 过滤数组,每个组合保留(count-1)个元素 obj = obj.filter(item => { const key = `${item.id}-${item.name}`; if (countMap[key] > 1) { countMap[key]--; return true; } return true; }); }
内容的提问来源于stack exchange,提问作者Almaz Kabiyev
相关产品推荐
相关产品推荐

