解决TypeError: Cannot read property 'category' of undefined及数组分组问题
问题分析与修复方案
原代码报错原因
你写的pre.cur.category是错误写法:pre是reduce的累加器对象,cur是当前遍历的数组元素,pre里根本没有cur这个属性,所以访问pre.cur.category必然抛出Cannot read property 'category' of undefined。另外原代码还遗漏了turnover字段的处理,也没按期望转换属性名的大小写。
简洁实现方案
用Array.reduce就能高效完成分组和属性转换,代码逻辑清晰:
const a = [ {id: "2197",name: "AC",currency: "EUR",category: "Equity",illiquidYears: 1.0,turnover: 0.15}, {id: "2194",name: "Japanese",currency: "EUR",category: "Equity",illiquidYears: 1.0,turnover: 0.15}, {id: "2221237",name: "Global Credit",currency: "EUR",category: "FixedIncome",illiquidYears: 1.0,turnover: 0.15}, {id: "7123928",name: "Duration Bonds",currency: "EUR",category: "FixedIncome",illiquidYears: 1.0,turnover: 0.15}, {id: "1151230",name: "Euro Cash",currency: "EUR",category: "FixedIncome",illiquidYears: 1.0,turnover: 0.15}, {id: "1151230",name: "Euro Cash",currency: "EUR",category: "Alternatives",illiquidYears: 1.0,turnover: 0.15}, {id: "`231150",name: "Euro Cash",currency: "EUR",category: "Alternatives",illiquidYears: 1.0,turnover: 0.15}, {id: "11`21350",name: "Euro Cash",currency: "EUR",category: "Others",illiquidYears: 1.0,turnover: 0.15} ]; const trans = (arr) => { return arr.reduce((acc, item) => { const category = item.category; // 转换为期望的属性格式 const formattedItem = { Name: item.name, IlliquidYears: item.illiquidYears, Turnover: item.turnover }; // 初始化分类数组(如果不存在) acc[category] = acc[category] || []; acc[category].push(formattedItem); return acc; }, {}); }; const b = trans(a); console.log(b);
代码说明
- 核心用
reduce遍历数组,acc作为容器存储分组后的结果 - 对每个元素,提取
category作为分组键,同时把属性名转换为大写开头的格式 - 用
acc[category] = acc[category] || []简化数组初始化逻辑,避免冗余的if判断 - 最后把转换好的元素推入对应分类的数组,返回最终结果
这个实现完全符合你的期望输出,同时解决了原代码的报错问题,代码简洁易维护。
内容的提问来源于stack exchange,提问作者Ae Leung
相关产品推荐
相关产品推荐

