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

如何按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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 14:54:55