Node.js按对象value属性去重对象数组(不使用_.uniq)
问题根源
你的代码去重失效是两个问题导致的:
[...new Set(bot.tags)]无法对对象数组生效:Set对对象的去重判断依据是内存引用地址,就算两个对象内容完全一致,只要不是同一个引用就会被判定为不同值,这步操作根本没实现去重。- 后续逻辑没有针对
value字段做重复校验:循环时用的是原始未去重的bot.tags长度做边界,取值却取的是未成功去重的tags数组,全程没有判断value是否重复,自然会生成重复条目。
修复代码
不需要依赖_.uniq,原生JS即可实现按value字段去重,以下是可直接运行的修正版本,顺便修复了你原代码里tags1未初始化的隐藏bug:
const existValueSet = new Set(); const tags2 = []; let tags1 = ''; for (const tag of bot.tags) { // 对应value已存在则直接跳过,不重复添加 if (existValueSet.has(tag.name)) continue; existValueSet.add(tag.name); tags1 += `\`${tag.label}\` `; tags2.push({ label: tag.label, value: tag.name, default: false }); } console.log(tags2);
逻辑说明
- 用
Set存储已经处理过的value值,重复判断的时间复杂度为O(1),性能远高于数组遍历查重复的方案 - 遍历过程中自动跳过重复value对应的条目,默认保留第一次出现的条目
- 遍历直接基于原始的
bot.tags数组,避免了原代码中遍历长度和取值源不匹配的问题
如果你需要保留重复项中最后一次出现的条目,只需要先倒序遍历数组,再把最终结果反转即可,常规场景下保留第一次出现的条目就可以满足需求。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

