API调用去重咨询:如何避免重复名称及filter用法验证
问题分析与修正方案
你的核心需求是避免重复名称同时出现在takes2xBucket和times4xBucket两个数组中,原代码里的filter用法完全错误——filter需要传入一个返回布尔值的回调函数,直接传字符串的写法根本无法实现去重检查。
原代码的问题点
times4xBucket.filter(doubleNames[i].name)语法逻辑双错误,filter的参数必须是回调函数,这里的写法既不符合语法要求,也达不到检查重复的目的。- 仅收集
takes2xBucket的名称,未同步检查times4xBucket的已有名称,可能导致新元素重复进入目标桶。
修正后的代码实现
我们可以用Set来存储两个桶里已有的所有名称,利用Set的has方法快速判断名称是否已存在,同时简化逻辑:
fetch(typeURL2) .then(response2 => response2.json()) .then(data2 => { const type2takes2x = data2.damage_relations.double_damage_from; // 收集两个桶里已有的所有名称,用Set提升查询效率 const existingNames = new Set([ ...takes2xBucket.map(item => item.name), ...times4xBucket.map(item => item.name) ]); // 单独提取takes2xBucket的名称集合,用于原逻辑判断 const takes2xNameSet = new Set(takes2xBucket.map(item => item.name)); for (const item of type2takes2x) { const itemName = item.name; // 先检查名称是否已存在,避免重复添加 if (existingNames.has(itemName)) continue; // 按原逻辑分类:已在takes2xBucket的放入times4xBucket,否则放入takes2xBucket if (takes2xNameSet.has(itemName)) { times4xBucket.push(item); } else { takes2xBucket.push(item); } // 将新加入的名称存入Set,防止后续重复处理 existingNames.add(itemName); } });
优化说明
- 用
Set替代数组includes,查询时间复杂度从O(n)降到O(1),数据量大时性能更优。 - 先统一检查所有已存在的名称,确保同一个名称不会出现在两个桶中,也不会在单个桶内重复。
- 用
for...of替代传统for循环,代码更简洁易读。
如果你的逻辑需要调整,只需修改分类判断的条件即可。
内容的提问来源于stack exchange,提问作者StevoB
相关产品推荐
相关产品推荐

