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

如何使用reduce函数从JS对象数组中获取去重后的唯一值

你的reduce写法存在两处核心错误,导致无法得到预期结果:

  1. 未给reduce传入第二个参数作为初始累计值,首次执行时累计参数a会默认取数组第一个元素,不是数组类型,后续逻辑执行异常
  2. 匹配到未重复元素时返回[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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 23:27:03