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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 20:36:21