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

如何正确分块处理JSON数组,按天统计各类型卡路里总量

按日期和餐型统计卡路里的问题解决

问题说明

我需要遍历JSON文件,提取每个项目的卡路里数值,按餐型和周一至周五共5天分类统计。JSON对象示例如下:

{
  "Date": "Thursday",
  "Name": "Shredded Chicken",
  "Icon": "Chicken",
  "Type": "Dinner",
  "Quantity": 85,
  "Units": "Grams",
  "Calories": 90
}

当前代码存在跨天累加的问题:比如周一的早餐卡路里会和周二的早餐卡路里叠加,只有第一天的统计结果正确(print(calTotal[18])返回[465,380,530,153,1528,899],是当日早餐、午餐、晚餐、零食、总摄入、净摄入卡路里的正确数值)。

目标:为每一天生成一个数组,包含当日各类型卡路里的总量(早餐、午餐、晚餐、零食、总摄入、净摄入)。

当前代码

let days = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"]; //currently does nothing
let calTotal = [];

function setup() {
    createCanvas(windowWidth, windowHeight);
    loadJSON("finalJSON.json", cbSuccess, cbFail);
}

function draw() {
    //to be utilized
}

function cbFail(data) {
    print("Error loading JSON File");
    print(data);
}

function cbSuccess(data) {
    let myData = data; //load our JSON array
    let calories = 0; //set a 0 starting value for calories
    let breakfastCalories = 0;
    let lunchCalories = 0;
    let dinnerCalories = 0;
    let snackCalories = 0;
    let burnedCalories = 0;
    for (let i = 0; i < myData.length; i++) { //count number of total entries in the dataset

        if (myData[i].Type == "Breakfast") {
            breakfastCalories += myData[i].Calories;
        }
        else if (myData[i].Type == "Lunch") {
            lunchCalories += myData[i].Calories;
        }
        else if (myData[i].Type == "Dinner") {
            dinnerCalories += myData[i].Calories;
        }
        else if (myData[i].Type == "Snacks") {
            snackCalories += myData[i].Calories;
        }
        else if (myData[i].Type == "Exercise") {
            burnedCalories += myData[i].Calories;
        }
        let grossCalories = round(breakfastCalories + lunchCalories + dinnerCalories + snackCalories);
        let netCalories = round(breakfastCalories + lunchCalories + dinnerCalories + snackCalories - burnedCalories);

        calTotal.push([round(breakfastCalories), round(lunchCalories), round(dinnerCalories), round(snackCalories), grossCalories, netCalories]);
    }
}

问题根源

卡路里统计变量没有按日期重置,所有日期的数值都在同一个变量里累加,导致跨天数据混在一起;同时当前代码每遍历一个条目就往calTotal里推送一次数据,而非每日结束时推送。

修改后的代码

let days = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"];
let calTotal = [];

function setup() {
    createCanvas(windowWidth, windowHeight);
    loadJSON("finalJSON.json", cbSuccess, cbFail);
}

function draw() {
    //to be utilized
}

function cbFail(data) {
    print("Error loading JSON File");
    print(data);
}

function cbSuccess(data) {
    let myData = data;
    // 按日期初始化统计结构
    const dailyStats = {};
    days.forEach(day => {
        dailyStats[day] = {
            breakfast: 0,
            lunch: 0,
            dinner: 0,
            snacks: 0,
            burned: 0
        };
    });

    // 遍历数据,按日期和餐型累加卡路里
    myData.forEach(item => {
        const day = item.Date;
        if (!dailyStats.hasOwnProperty(day)) return;

        switch(item.Type) {
            case "Breakfast":
                dailyStats[day].breakfast += item.Calories;
                break;
            case "Lunch":
                dailyStats[day].lunch += item.Calories;
                break;
            case "Dinner":
                dailyStats[day].dinner += item.Calories;
                break;
            case "Snacks":
                dailyStats[day].snacks += item.Calories;
                break;
            case "Exercise":
                dailyStats[day].burned += item.Calories;
                break;
        }
    });

    // 转换为目标数组格式并存入calTotal
    days.forEach(day => {
        const stats = dailyStats[day];
        const gross = round(stats.breakfast + stats.lunch + stats.dinner + stats.snacks);
        const net = round(gross - stats.burned);
        calTotal.push([
            round(stats.breakfast),
            round(stats.lunch),
            round(stats.dinner),
            round(stats.snacks),
            gross,
            net
        ]);
    });

    // 测试输出每日统计结果
    calTotal.forEach((stats, index) => {
        print(`${days[index]}: ${stats}`);
    });
}

代码说明

  • 用dailyStats对象为每个日期独立初始化统计变量,彻底避免跨天累加
  • 遍历JSON数据时,将卡路里精准累加到对应日期的对应类型中
  • 最后按days顺序将每日统计结果转换为要求的数组格式,存入calTotal,数组每一项对应周一至周五的每日数据

内容的提问来源于stack exchange,提问作者Tony Rayo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 20:45:55