如何使用reduce函数从JS对象数组中获取去重后的唯一值
你的reduce写法存在两处核心错误,导致无法得到预期结果:
- 未给reduce传入第二个参数作为初始累计值,首次执行时累计参数
a会默认取数组第一个元素,不是数组类型,后续逻辑执行异常 - 匹配到未重复元素时返回
[a,b]会将累计数组嵌套到新数组中,且未匹配到重复元素时没有返回累计值,会导致后续累计值变为undefined
基础实现(符合你的需求)
const unique = data.reduce((acc, current) => { // 判断当前productId是否已经存在于累计数组中 const hasExisted = acc.some(item => item.productId === current.productId) if (!hasExisted) { acc.push({ productId: parseInt(current.productId), quantity: 1 }) } // 每次迭代必须返回累计数组 return acc }, []) // 初始值传入空数组作为累计容器
高性能优化版(适合数据量较大的场景)
上述基础实现中每次判断重复都要遍历累计数组,时间复杂度为O(n²),可以通过Set存储已出现的ID,将时间复杂度降低到O(n):
const unique = data.reduce((acc, current) => { const pid = current.productId if (!acc.idSet.has(pid)) { acc.result.push({ productId: parseInt(pid), quantity: 1 }) acc.idSet.add(pid) } return acc }, { result: [], idSet: new Set() }).result
执行后打印unique即可得到你期望的去重结果。
内容的提问来源于stack exchange,提问作者Profer
相关产品推荐
相关产品推荐

