使用reduce函数按对象属性分组时每个分类数组仅存1条数据的问题咨询
错误原因
你的代码存在以下几个核心问题:
- 冗余的for循环:reduce本身会自动遍历原数组的所有元素,不需要额外嵌套for循环,嵌套的循环逻辑反而打断了reduce正常的迭代流程
- 分类数组被反复覆盖:每次处理元素时你都直接执行
cat[item.category] = [],会清空该分类下之前已经存入的所有元素,最终每个分类只会保留最后一次处理的对应元素 - 循环逻辑存在死循环风险:你写的for循环判断条件为
data.length,只要原数组不为空就会无限执行,只是因为你在循环内直接return才没有触发死循环,但也导致每次reduce迭代只处理当前元素就提前返回
修正后的实现代码
const grouped = data.reduce((cat, item) => { // 分类不存在时先初始化空数组,避免覆盖已有内容 if (!cat[item.category]) { cat[item.category] = [] } // 向对应分类数组中追加当前元素 cat[item.category].push(item) // 返回累计结果给下一轮迭代 return cat }, {})
补充说明
你给出的示例数据存在两处语法问题,实际运行时需要先修正:
- 对象的多个属性之间需要用英文逗号分隔,比如
category: "date of admission"后需要加逗号 subcategory: 2-days的属性值是字符串,需要用引号包裹,修改为subcategory: "2-days"
内容的提问来源于stack exchange,提问作者CourtneyJ
相关产品推荐
相关产品推荐

