如何修正JavaScript代码实现项目工时与Bid值的正确计算?
修正按项目计算总收益的JavaScript函数
我看了你的代码和需求描述,问题很明确:你的代码把所有项目的工时都累计到同一个全局的total变量中,最后用所有项目的总工时乘以当前项目的bid值,而且每次循环都会覆盖totalAmount,导致最终结果只是总工时乘以最后一个项目的bid值,完全不符合“按项目单独计算后累加”的要求。
错误点拆解:
total、totalHours变量定义在项目循环外部,所有项目的timers都会往同一个total里累加时间,导致工时计算混乱totalAmount = totalHours * value这行是直接赋值而非累加,最后只会保留最后一个项目的计算结果(且这个计算本身也是错误的,因为totalHours是所有项目的总工时)
修正后的代码
calculateTotalAmountEarned(projects) { let totalAmount = 0; projects.forEach((project) => { // 每个项目单独初始化工时统计变量,避免跨项目干扰 let projectTotalDuration = moment.duration(0); // 计算当前项目所有有效timer的时间差总和 project.timers.forEach((timer) => { if (timer.stopped_at) { const started = moment(timer.started_at); const stopped = moment(timer.stopped_at); const timeDiff = moment.duration(stopped.diff(started)); projectTotalDuration.add(timeDiff); } }); // 转换为小时(保留你原有的取整逻辑,若需要精确小数可调整toFixed参数) const projectTotalHours = +projectTotalDuration.asHours().toFixed(0); // 获取当前项目的bid值(假设每个项目对应一个bid,取第一个即可) const bidValue = project.bids.length ? parseFloat(project.bids[0].value) : 0; // 计算当前项目收益并累加到总收益 totalAmount += projectTotalHours * bidValue; }); return totalAmount; }
关键改动说明:
- 项目独立计算工时:把工时统计变量
projectTotalDuration放在项目循环内部,确保每个项目的工时计算互不干扰 - 累加而非覆盖总收益:用
totalAmount += ...替代直接赋值,逐步累加每个项目的收益 - 严谨处理bid值:通过
project.bids[0].value获取当前项目的bid值,同时做了空数组判断避免报错,还把字符串类型的value转为数值类型,防止字符串相乘的错误 - 优化变量作用域:移除了不必要的全局变量,把变量限制在对应作用域内,避免污染和逻辑混乱
验证示例逻辑
按照你给出的测试场景:
- 项目1:3个1小时的timer,bid值14 → 3*14=42
- 项目2:3个1小时的timer,bid值14 → 3*14=42
- 总收益:42+42=84
修正后的代码会正确计算出这个预期结果。
内容的提问来源于stack exchange,提问作者user8691240
相关产品推荐
相关产品推荐

