循环中为对象属性赋值如何避免覆盖原有值?附TS代码案例
TypeScript 循环赋值覆盖问题修复方案
问题核心
原有代码对子部件的统计值直接赋值,后续匹配到同名称子部件时会覆盖之前的计算结果,未做累加处理。
修改后代码
// 可直接复用你项目中已有的BOM、Sale类型定义 type BOM = { part_num: string; sub_part_num: string; qty: number; } type Sale = { part_num: string; qty: number; } export const BOMs: BOM[] = [ { part_num: "X-Wing", sub_part_num: "Max Engine", qty: 4 }, { part_num: "X-Wing", sub_part_num: "Airplane Body", qty: 1 }, { part_num: "Tie Fighter", sub_part_num: "Max Engine", qty: 2 }, { part_num: "Tie Fighter", sub_part_num: "Airplane Body", qty: 1 }, ]; export const Sales: Sale[] = [ { part_num: "X-Wing", qty: 100 }, { part_num: "Tie Fighter", qty: 200 }, ]; function generate_report(boms: BOM[], sales: Sale[]): Record<string, number> { const myObj: Record<string, number> = {}; boms.forEach(bom => { // 匹配对应成品的销售数据 const targetSale = sales.find(item => item.part_num === bom.part_num); if (!targetSale) return; const currentSubTotal = bom.qty * targetSale.qty; // 子部件累加逻辑:已存在值则相加,不存在则初始化为当前计算值 myObj[bom.sub_part_num] = (myObj[bom.sub_part_num] ?? 0) + currentSubTotal; // 成品销量直接赋值即可,同一成品销量不会重复 myObj[bom.part_num] = targetSale.qty; }) return myObj; }
运行结果
调用函数后返回的结果符合预期:
{ "Max Engine": 800, "X-Wing": 100, "Airplane Body": 300, "Tie Fighter": 200 }
优化说明
- 原代码使用
map做纯遍历属于用法不合理,map用于生成新数组,纯遍历替换为forEach语义更清晰 - 去掉嵌套循环,改为单层遍历BOM后匹配对应销售条目,减少不必要的循环次数
- 累加逻辑使用空值合并运算符
??判断属性是否存在,比||更严谨,避免0值被误判的问题
内容的提问来源于stack exchange,提问作者London804
相关产品推荐
相关产品推荐

