如何正确分块处理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
相关产品推荐
相关产品推荐

