Как я могу добавлять значения к объекту, не перезаписывая предыдущий в цикле?

#typescript #loops #object

Вопрос:

Возьмите следующий код:

 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[]) {

   let myObj = {};
   BOMs.map(bom => {
      sales.map(sale => {
          if (sale.part_num === bom.part_num)  {
              myObj[bom.sub_part_num] = bom.qty * sale.qty  
              myObj[bom.part_num] = sale.qty; 

          }
      })
  })

  return myObj;
}


// myObj {
     'Max Engine': 400,
     'X-Wing': 100,
     'Airplane Body': 200,
     'Tie Fighter': 200
   }
 

Мой тест ожидает, что myObj вернется

 expect(results["Max Engine"]).toBe(100 * 4   200 * 2); // 800
 

Это число предполагает количество 400 для «Крестокрыла» и 400 для «Истребителя». Что происходит, так это то, что мой цикл перезаписывает значение максимального двигателя в X-крыле и возвращает только значение для истребителя, которое составляет 200 x 2 = 400.

Как я могу изменить свой код, чтобы эти значения были объединены?

Комментарии:

1. Не должно ли это быть boms.map скорее тогда BOMs.map ?

2. Нет, посмотрите на первую функцию.

3. generate_report это первая функция, и у нее есть неиспользуемый параметр boms .

4. Да, хорошая мысль. Я, должно быть, просматриваю экспортированную функцию внутри своей функции.

Ответ №1:

Ты хочешь

 myObj[bom.sub_part_num] = bom.qty * sale.qty 
 

чтобы вместо этого быть

 if (!myObj[bom.sub_part_num]) {
    myObj[bom.sub_part_num] = 0;
}
myObj[bom.sub_part_num]  = bom.qty * sale.qty;
 

или более лаконично:

 myObj[bom.sub_part_num] = (myObj[bom.sub_part_num] || 0)   bom.qty * sale.qty