Суммарный массив объекта ключа возвращает NaN для более чем 2 элементов в JavaScript

Ниже мой массив -

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
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
84
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

По умолчанию начальное значение аккумулятора - это первый элемент в массиве. Если первым элементом является объект, то добавление чего-либо к объекту приведет к 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>

Другие вопросы по теме