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

