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

如何将行转列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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 12:03:30