如何将行转列JSON对象?现有代码无法生成正确结果及总计
数据格式转换解决方案
原始数据
const datalist = [{"Week":"01","Apple":8,"Orange":1}, {"Week":"02","Orange":9,"Apple":1}, {"Week":"03","Apple":10,"Orange":0}];
目标格式
const datalist = [{"Food":"Apple","Week 1":8,"Week 2":1, "Week 3": 10, "Total" : 19}, {"Food":"Orange","Week 1":0,"Week 2":9, "Week 3": 0, "Total" :10 }];
原代码问题
你的原代码逻辑方向有误:它是按Week字段分组,但我们需要按食物类型(Apple、Orange)来分组,同时没有处理总计值的计算,也没有正确映射每周的数值到对应字段。
正确实现代码
const convert = (toConvert) => { // 提取所有需要统计的食物类型(排除Week字段) const foodTypes = Object.keys(toConvert[0]).filter(key => key !== 'Week'); // 初始化每个食物的统计模板 const foodMap = foodTypes.reduce((map, food) => { map.set(food, { Food: food, Total: 0 }); return map; }, new Map()); // 遍历每周数据,填充周数值并累加总计 toConvert.forEach(item => { const weekNumber = parseInt(item.Week); const weekKey = `Week ${weekNumber}`; foodTypes.forEach(food => { const value = item[food] || 0; // 给当前食物添加对应周的数据 foodMap.get(food)[weekKey] = value; // 累计到总计 foodMap.get(food).Total += value; }); }); // 将Map转换为数组返回 return [...foodMap.values()]; }; // 测试示例 const datalist = [{"Week":"01","Apple":8,"Orange":1}, {"Week":"02","Orange":9,"Apple":1}, {"Week":"03","Apple":10,"Orange":0}]; console.log(convert(datalist));
代码逻辑说明
- 提取食物类型:从第一条数据中过滤掉
Week字段,得到所有需要统计的食物名称,保证代码能适配更多食物类型(如果后续新增)。 - 初始化统计对象:为每个食物创建基础对象,包含
Food标识和初始为0的Total字段。 - 填充数据与计算总计:循环处理每周的数据,将对应食物的数值填入
Week X字段,同时把数值累加到Total中。 - 转换结果格式:将Map中的值转为数组,得到最终需要的格式。
内容的提问来源于stack exchange,提问作者kanishka kumarasiri
相关产品推荐
相关产品推荐

