Вычитание всех значений в массиве из первого элемента

1

Итак, у меня есть этот массив объектов, который выглядит так:

let budgetData = [{title: "Monthly Income", amount: "2500"}, {title: 
"rent", amount: "1000"},{title: "car", amount: "200"};

Я пытаюсь сделать такую математику следующим образом:

2500 - 1000 - 200 = все это тоже выходит. Вы можете продолжать добавлять суммы к этому массиву, пока не добавите свои ежемесячные расходы.

Когда вы запускаете это в первый раз только с двумя значениями, сумма будет то, что вы ожидаете (т.е. 2 - 1 = 1).

Однако добавьте больше, чем две суммы в массив, он только вычитает любое последнее значение из первого значения (т.е. 5 - 2 - 1 = 4).

let amount = [];

for (let i = 1; i < budgetData.length; i++){ amount = 
budgetData[0].amount - budgetData[i].amount;


Console.log(amount) === 2300

Таким образом, этот код с приведенной выше информацией дает ответ: 2300, когда я ожидаю, что он скажет 1300.

Где я ошибаюсь в этом, также есть ли встроенная математическая функция, которая будет делать то, что я пытаюсь сделать?

  • 1
    Вы не держите промежуточный итог.
  • 1
    Другими словами, вы продолжаете перезаписывать amount в каждой итерации цикла
Теги:
arrays
for-loop
math

2 ответа

1
Лучший ответ

Каждый раз через цикл вы отбрасываете то, что вы рассчитали раньше, и переписываете amount с новым расчетом. Итак, в конце концов, вы просто вычитаете последнее число из первого числа.

Вместо этого вам нужно сохранить текущий счет. Что-то вроде этого:

let budgetData = [
  {title: "Monthly Income", amount: "2500"}, 
  {title: "rent", amount: "1000"},
  {title: "car", amount: "200"}
];

let amount = budgetData[0].amount;

for (let i = 1; i < budgetData.length; i++){ 
   amount = amount - budgetData[i].amount;
}

console.log(amount);
  • 0
    Хм, проблема только в том, что массив budgetData - ничто, пока пользователь не введет что-то, поэтому я получаю ошибку «сумма не определена».
  • 0
    Да, вы захотите запускать этот код только тогда, когда у вас есть данные. Если вам нужно проверить, что у вас нет данных, вы можете обернуть все это в if (!budgetData || budgetData.length === 0)
Показать ещё 1 комментарий
1

В качестве альтернативы вы можете уменьшить массив:

const total = budgetData.reduce((previous, current) => (previous.amount || previous) - current.amount);

Если ваши объекты бюджета реализуют метод valueOf, например:

 class Budget {
  constructor(settings){
     Object.assign(this, settings);
  }
  valueOf(){ return this.amount;}
}

budgetData = budgetData.map(el => new Budget(el));

Он становится еще красивее:

const total = budgetData.reduce((a,b) => a-b);
  • 0
    Та же ситуация, массив инициализируется ничем, пока не будет принят пользовательский ввод.
  • 0
    @alexander ну тогда просто посчитайте, был ли введен пользовательский ввод ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню