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

如何用JavaScript实现对象数组去重:非指定ID项值自动递增

解决数组对象去重并递增value的问题

需求描述

给定对象数组arrlist和参数uid,处理规则如下:

  • 若对象的value为非null的重复值,且其id与uid不相等,则自动递增该value值
  • 最终数组中所有非null的value值需唯一

示例1

var uid1 = 26
var arrlist1 = [
  {id: 11 , value: 2},
  {id: 14, value: null},
  {id: 28, value: 1},
  {id: 26, value: 3},
  {id: 78, value: 3}
]

预期输出:

[
  {id: 11 , value: 2},
  {id: 14, value: null},
  {id: 28, value: 1},
  {id: 26, value: 3},
  {id: 78, value: 4}
]

说明:id为26的项与uid匹配,value保持不变;id为78的项value重复,递增为4。

示例2

var uid2 = 78
var arrlist2 = [
  {id: 11 , value: 2},
  {id: 14, value: null},
  {id: 28, value: 1},
  {id: 26, value: 3},
  {id: 78, value: 1}
]

预期输出:

[
  {id: 11 , value: 3},
  {id: 14, value: null},
  {id: 28, value: 2},
  {id: 26, value: 4},
  {id: 78, value: 1}
]

说明:id为78的项与uid匹配,value保持不变;其余非null且重复的value依次递增至无重复。

我的尝试代码(存在问题)

const result = this.getArrObj(arrlist1, uid1)

function getArrObj (arrlist, uid) {
  const totalobj = arrlist.filter(e=>e!==null).length);

  var finalArrObj = arrlist.map(itm => ({
    ...itm,
    value: (itm.value && (itm.id !== uid && itm.value <= totalobj)) ?  
      (itm.value || 0) + 1 : itm.value
  })

}

解决方案

你的代码存在语法错误(totalobj行多了一个闭合括号),且逻辑不完整(仅做了一次递增,无法处理多次重复的场景)。以下是符合需求的实现:

function getArrObj(arrlist, uid) {
  // 锁定uid对应项的value,作为不可修改的基准值
  const lockedValue = arrlist.find(item => item.id === uid)?.value;
  // 用Set记录已使用的非null value,快速检查重复
  const usedValues = new Set();

  // 先把锁定值加入集合(非null时)
  if (lockedValue !== null) {
    usedValues.add(lockedValue);
  }

  return arrlist.map(item => {
    // uid项直接返回原对象副本
    if (item.id === uid) {
      return {...item};
    }
    // value为null的项直接返回
    if (item.value === null) {
      return {...item};
    }

    let currentVal = item.value;
    // 循环递增直到找到未被使用的value
    while (usedValues.has(currentVal)) {
      currentVal++;
    }
    // 标记该值已使用
    usedValues.add(currentVal);
    return {...item, value: currentVal};
  });
}

// 测试示例1
var uid1 = 26
var arrlist1 = [
  {id: 11 , value: 2},
  {id: 14, value: null},
  {id: 28, value: 1},
  {id: 26, value: 3},
  {id: 78, value: 3}
]
console.log(getArrObj(arrlist1, uid1));

// 测试示例2
var uid2 = 78
var arrlist2 = [
  {id: 11 , value: 2},
  {id: 14, value: null},
  {id: 28, value: 1},
  {id: 26, value: 3},
  {id: 78, value: 1}
]
console.log(getArrObj(arrlist2, uid2));

代码说明

  • 使用Set存储已使用的value,检查重复的时间复杂度为O(1),效率更高
  • 对每个非uid、非null的项,循环递增直到找到唯一值,确保所有非null value无重复
  • 保留uid项的value不变,完全符合需求
  • 所有操作返回新对象,不修改原数组,保持数据不可变性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 20:20:09