ES6中Reducer调用map.has报not a function错误,求对象数组去重方案
解决“map.has is not a function”错误并实现数组去重需求
错误原因
你的代码里,reduce回调的三元表达式犯了个关键错误:当检测到id已存在时,你返回了空字符串"",这会把累加器的类型从Map直接替换成字符串。后续迭代时,调用map.has()就会报错——字符串根本没有has方法。
修复后的代码
const arr1 = [{ id: "1", value: "English" }, { id: "2", value: "Italian" } ]; const arr2 = [{ id: "2", value: '10' }, { id: "3", value: "German" } ]; const concatArr = arr1.concat(arr2); // 修复核心:id存在时返回原Map,而非空字符串 const mergedArr = [...concatArr.reduce((map, obj) => map.has(obj.id) ? map : map.set(obj.id, obj), new Map() ).values()]; console.log(mergedArr); // 输出:[{id: "1", value: "English"}, {id: "2", value: "Italian"}, {id: "3", value: "German"}]
逻辑说明
- 先合并两个数组得到包含重复项的
concatArr - 用
reduce遍历数组,以Map作为累加器存储已出现的id和对应的对象- 若当前对象的id已在Map中,直接返回原Map,不做任何修改(保留首次出现的对象)
- 若id不存在,用
map.set()把对象存入Map,set方法会返回Map本身,所以可以直接链式返回
- 最后通过
Map.values()获取所有去重后的对象,再用扩展运算符转成数组
内容的提问来源于stack exchange,提问作者inquisitivemongoose
相关产品推荐
相关产品推荐

