#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