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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 03:36:20