Ниже мой массив -
const products = [{
id: "1",
quantity: 3
}, {
id: "2",
quantity: 3
}]
console.info(products.reduce((acc, product) => acc.quantity + product.quantity)) // 6 -> Correct
Но если массив содержит более двух элементов, в результате он выбрасывает NaN. Сообщите мне, что я здесь делаю не так.
const products = [{
id: "1",
quantity: 3
}, {
id: "2",
quantity: 3
}, {
id: "3",
quantity: 4
}]
console.info(products.reduce((acc, product) => acc.quantity + product.quantity)) // NaN -> InCorrect



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


По умолчанию начальное значение аккумулятора - это первый элемент в массиве. Если первым элементом является объект, то добавление чего-либо к объекту приведет к NaN.
Просто предоставьте reduce еще один аргумент, чтобы предоставить начальное значение для аккумулятора, и убедитесь, что аккумулятор регистрирует сумма:
const products = [{
id: "1",
quantity: 3
}, {
id: "2",
quantity: 3
}, {
id: "3",
quantity: 4
}];
const total = products.reduce((acc, product) => acc + product.quantity, 0);
console.info(total);Если вы используете очень хотел, чтобы аккумулятор сохранял вместо этого объект, вы могли бы это сделать, но это приведет к изменению первого элемента в массиве, вам нужно будет убедиться, что вы получили доступ к соответствующему свойству, чтобы зарегистрировать его:
const products = [{
id: "1",
quantity: 3
}, {
id: "2",
quantity: 3
}, {
id: "3",
quantity: 4
}]
console.info(products.reduce((acc, product) => {
acc.quantity += product.quantity;
return acc;
}).quantity) Но это плохая идея В самом деле.
Потому что acc второй раз равен 6, acc.quantity не определен. Чтобы решить эту проблему, замените acc.quantity на acc и используйте 0 в качестве стартового аккумулятора.
Метод reduce() применяет функцию к аккумулятору и каждому элементу в массиве (слева направо), чтобы уменьшить его до одного значения.
В вашей переменной acc он содержит значение, а не объект, который вы напрямую добавляете с новым количеством, подобным этому
ДЕМО
const products = [{
id: "1",
quantity: 3
}, {
id: "2",
quantity: 3
}, {
id: "3",
quantity: 4
}];
let result = products.reduce((acc, {quantity}) => acc +quantity, 0);
console.info(result).as-console-wrapper { max-height: 100% !important; top: 0;}This works perfectly fine
<script>
const products = [{id: "1", quantity: 3},{id: "2",
quantity: 3},{id: "3", quantity: 4}];
total = Object.values(products).reduce((t, n) => t
+ n.quantity, 0);
console.info(total);
</script>