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

如何获取reduce()方法转换后的指定分类数组

问题根源

你当前代码的核心错误是reduce方法的初始值类型和目标数据结构不匹配:

  • 你需要的是「分类名作为key、对应分类商品数组作为value」的映射结构,却给reduce传了空数组[]作为初始值
  • JS中数组本质是特殊对象,确实可以挂载字符串key的自定义属性,但这种写法会导致数组length统计异常、JSON序列化丢失自定义属性、forEach/map等原生数组遍历方法读不到挂载的分类数据,属于不推荐的取巧写法。
可行实现方案

方案1:使用对象作为分组结果(最贴合你按key取数组的需求)

直接把reduce初始值替换为空对象{},生成标准的键值对映射结构,取值完全符合你的预期:

const newProductsDetail = [/* 你的原始商品数组 */]
const groupedProducts = newProductsDetail.reduce((acc, curr) => {
  const { categoryName } = curr
  if (!acc[categoryName]) {
    acc[categoryName] = []
  }
  acc[categoryName].push(curr)
  return acc
}, {}) // 初始值从[]改为{}

取值方式非常直接,传入分类名即可拿到对应数组:

// 例如获取「家用电器」分类下的所有商品
const homeApplianceList = groupedProducts["家用电器"]

方案2:输出纯数组结构(适合后续直接遍历渲染分类板块)

如果你希望最终结果是标准数组,不需要按键名查值,可以调整reduce逻辑,每个数组元素存储分类名和对应商品列表:

const categoryList = newProductsDetail.reduce((acc, curr) => {
  const { categoryName } = curr
  const targetCategory = acc.find(item => item.categoryName === categoryName)
  if (targetCategory) {
    targetCategory.list.push(curr)
  } else {
    acc.push({
      categoryName,
      list: [curr]
    })
  }
  return acc
}, [])

这种结构的取值需要先匹配分类名:

// 获取「食品生鲜」分类下的商品数组
const foodList = categoryList.find(item => item.categoryName === "食品生鲜")?.list

注意:不要继续使用给数组挂载自定义属性的写法,该写法在数据序列化、数组方法调用时大概率出现非预期bug。

内容的提问来源于stack exchange,提问作者Thanh Trung

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 06:03:25