Не могу вычислить сумму полей объекта , в массиве

const items = [{ price: 150 }, { price: 150 }, { price: 100 }, { price: 100 }];

let result = items.map(({ price }) => price);

const calculateTotal = result.reduce((total, amount, index, array) => {
  let summ = 0;
  return (summ += amount);
}, 0);

console.log(calculateTotal);

Почему код не верный, предпологаю что на каждой итерации, summ прибавляется, как исправить и посчитать сумму всех price ?


Ответы (3 шт):

Автор решения: Алексей Шиманский

const items = [{ price: 150 }, { price: 150 }, { price: 100 }, { price: 100 }];

let result = items.map(({ price }) => price);

const calculateTotal = result.reduce((total, amount, index, array) => {  
  return (total += amount);
}, 0);

console.log(calculateTotal);


Можно сразу с объектом работать

const items = [{ price: 150 }, { price: 150 }, { price: 100 }, { price: 100 }];
const calculateTotal = items.reduce((total, item) => total += item.price, 0);

console.log(calculateTotal);

→ Ссылка
Автор решения: Grundy

не используется total - результат с прошлого шага. Вместо этого каждый раз создается summ=0 к которому прибавляется amount. Таким образом каждый раз вычисляется amount а не общая сумма.

Вместо этого нужно использовать total

const items = [{
  price: 150
}, {
  price: 150
}, {
  price: 100
}, {
  price: 100
}];

let result = items.map(({
  price
}) => price);

const calculateTotal = result.reduce((total, amount, index, array) => {
  return total + amount;
}, 0);

console.log(calculateTotal);

→ Ссылка
Автор решения: Alexander
const calculateTotal = result.reduce((total, amount, index, array) => {
  let summ = 0;
  return (summ += amount);
}, 0);

Тут вы никак не задействуете переменную total. Можно переделать функцию в вашем цикле reduce вот так:

const items = [{ price: 150 }, { price: 150 }, { price: 100 }, { price: 100 }];

let result = items.map(({ price }) => price);

const calculateTotal = result.reduce((total, amount, index, array) => {
  total += amount
  return total;
}, 0);

Теперь всё работает.


Если вам интересно как можно улучшить этот код в принципе:

Операция в функции-теле цикла настолько примитивна, что можно записать её в одну строку:

const items = [{ price: 150 }, { price: 150 }, { price: 100 }, { price: 100 }];

let result = items.map(({ price }) => price);

const calculateTotal = result.reduce((total, amount, index, array) => {
  return total + amount;
}, 0);

Далее можно убрать лишние символы, которые затрудняют работу с кодом:

const items = [{ price: 150 }, { price: 150 }, { price: 100 }, { price: 100 }];

let result = items.map(({ price }) => price);

const calculateTotal = result.reduce((total, amount) => total + amount, 0);

Потом можно убрать лишний проход циклом по массиву:

const items = [{ price: 150 }, { price: 150 }, { price: 100 }, { price: 100 }];

const calculateTotal = items
  .reduce((total, amount) => total + amount.price, 0);
→ Ссылка