JavaScript中用reduce处理对象数组按天统计时长遇targetDay错误求助
解决按天统计每周时长的问题
看起来你是卡在了日期映射到星期几的环节上,我来给你一套完整的解决方案,顺便排查targetDay相关的常见错误:
完整代码示例(JavaScript)
假设你的输入数据是类似这样的格式:
const timeEntries = [ { date: '2024-02-04', hours: 4, otherField: 'xxx' }, // 对应周日 { date: '2024-02-07', hours: 5, otherField: 'yyy' }, // 对应周三 // 其他更多时间条目... ];
下面是可以直接运行的统计逻辑:
// 定义一周的显示顺序(按你的示例要求从周日开始) const weekDays = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']; // 初始化统计数组,每个元素对应某天的总时长,初始值为0 const dailyHours = new Array(weekDays.length).fill(0); // 遍历所有条目进行统计 timeEntries.forEach(entry => { const date = new Date(entry.date); // Date.getDay() 返回 0(周日)到 6(周六),正好对应weekDays的索引 const dayIndex = date.getDay(); // 累加时长,同时兼容hours可能不是数字的情况 dailyHours[dayIndex] += parseFloat(entry.hours) || 0; }); // 拼接成你需要的输出格式:星期缩写 + 对应时长 const output = [...weekDays, ...dailyHours].join(' '); console.log(output); // 输出结果:Sun Mon Tue Wed Thu Fri Sat 4 0 0 5 0 0 0
排查targetDay错误的核心要点
你遇到的targetDay相关问题,大概率是在日期到星期索引的映射上出了问题,常见的坑有这几个:
- 混淆
getDay()返回值:Date.getDay()返回的是0(周日)到6(周六),如果误以为1是周日,会直接导致索引偏移,甚至触发数组越界错误。 - 星期数组顺序不匹配:比如你的星期显示数组是从周一开始的,但统计逻辑用了周日为0的索引,会导致统计结果完全错位。
- 日期格式无效:如果
entry.date的格式不被Date对象识别,会返回无效日期,导致dayIndex变成NaN,进而操作数组时出错。
适配你示例的特殊输出(若确实需要省略周四)
如果你的示例里确实不需要显示周四(可能是笔误),可以调整映射逻辑来匹配:
const weekDays = ['Sun', 'Mon', 'Tue', 'Wed', 'Fri', 'Sat']; // 建立系统星期索引到我们显示数组的映射 const dayMapping = { 0:0, 1:1, 2:2, 3:3, 5:4, 6:5 }; const dailyHours = new Array(weekDays.length).fill(0); timeEntries.forEach(entry => { const date = new Date(entry.date); const dayIndex = date.getDay(); // 只处理我们需要的星期几,自动忽略周四 if (dayMapping.hasOwnProperty(dayIndex)) { dailyHours[dayMapping[dayIndex]] += parseFloat(entry.hours) || 0; } }); const output = [...weekDays, ...dailyHours].join(' '); console.log(output); // 输出结果:Sun Mon Tue Wed Fri Sat 4 0 0 5 0 0
如果你的业务场景用的是其他语言(比如Python),可以告诉我,我再调整对应的实现~
内容的提问来源于stack exchange,提问作者Amer Bearat
相关产品推荐
相关产品推荐

