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

循环中为对象属性赋值如何避免覆盖原有值?附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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 13:39:03