Стрелочная функция с возвратом при уменьшении вызова

//Example 1:
var primaryColors = [
  { color: 'red' },
  { color: 'blue' },
  { color: 'yellow' },
];

var answer = primaryColors.reduce((x,y) => x.push(y.color) , []);
//x.push is not a function



//Example 2:
var ints = [1,2,3];
var sum = ints.reduce((sum, number) => sum + number, 0);
//sum = 6

Как показано выше, в примере 1 будет генерироваться исключение TypeError: x.push is not a function. Чтобы заставить его работать, мы можем добавить пару фигурных скобок и возвращаемое значение, как показано ниже.

var answer = primaryColors.reduce((x,y) => { x.push(y.color); return x;}, []);

Сейчас я не совсем понимаю необходимость return. Почему в примере 2 можно суммировать без использования ключевого слова return, в то время как в примере 1 для работы требуется ключевое слово return?

Вы пробовали читать документацию о том, что делает reduce? См. здесь

CertainPerformance 20.05.2018 06:32

Проблема в том, что x.push() возвращает новую длину массива, и это то, что возвращает ваш обратный вызов .reduce(). Но вам нужно выполнить return x из этого обратного вызова, чтобы ваш код имел шанс работать правильно. При втором вызове обратного вызова x будет 1, а 1.push() - ошибкой. Если вы не понимаете, зачем вам return x, то изучите документацию по .reduce() более подробно. x - это аккумулятор, и значение x в следующей итерации вашего обратного вызова будет тем, что вы вернули из предыдущей.

jfriend00 20.05.2018 06:35

@ jfriend00 не могли бы вы опубликовать ответ? иначе вопрос останется без ответа, потому что нет другого правильного ответа, кроме вашего

skyboyer 20.05.2018 06:38

Почему со всеми отрицательными голосами? Я неправильно пользуюсь сайтом? Если единственная причина отрицательных голосов заключается в том, что мне не удалось понять документацию, тогда, я думаю, у этого сайта вообще нет смысла существовать?

Isaac 20.05.2018 07:03
Поведение ключевого слова "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) для оценки ваших знаний,...
2
4
542
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Why does Example 1 need a return keyword in order to work?

Проблема в том, что x.push() возвращает новую длину массива, и это то, что возвращает ваш обратный вызов .reduce(). Но .reduce() примет возвращаемое значение из вашего обратного вызова и передаст его в качестве следующего значения для x в следующей итерации цикла. Значит вам нужен return x.

Как вы это делаете, при втором вызове обратного вызова x будет 1, а 1.push() - ошибкой.

Если вы не понимаете, зачем вам return x, то изучите документацию по .reduce() более подробно. x - это аккумулятор, и значение x в следующей итерации вашего обратного вызова будет тем, что вы вернули из предыдущей.

Why Example 2 can sum without using the keyword return

Поскольку ваш пример 2 возвращает sum + number, который вы хотите передать как сумму для следующей итерации цикла. Итак, он возвращает то, что нужно.


К вашему сведению, ваш первый цикл, возможно, легче выполнить с .map():

//Example 1:
var primaryColors = [
  { color: 'red' },
  { color: 'blue' },
  { color: 'yellow' },
];

var answer = primaryColors.map(item => item.color);

Поправьте меня, если я ошибаюсь, но так, как я это делал, второй раз вызывается мой обратный вызов, x не 1, потому что первая итерация была x.push(y.color)

Isaac 20.05.2018 06:47

@Isaac - возвращаемое значение x.push() - это длина массива x после нажатия. Эта длина будет 1 после первого нажатия, потому что массив изначально был пуст, а затем вы вставили в него один элемент. Но вы можете просто console.info(x), если хотите увидеть, что это такое.

jfriend00 20.05.2018 06:54

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