Понимание того, как работает функция reduce()

Я просто удостоверяюсь, что знаю, как работает эта функция. Я читал материал и смотрел видео о функции сокращения, наверное, 3 часа прошлой ночью, я не понял. Я отошел от компьютера, приготовил еду, посмотрел телешоу, снова посмотрел на компьютер и БАМ! Я понял. Теперь я знаю, как работает функция сокращения.

Я просто не знаю, почему первый пример ниже работает, а второй нет.

источник: Eloquent Javascript Ch. 5 §Сведение

Это работает:

var arrays = [[1, 2, 3], [4, 5], [6]];

var flattened = arrays.reduce(function(a, b) {
  return a.concat(b);
});

flattened; //=>[1, 2, 3, 4, 5, 6]

Я пытался возиться с кодом, чтобы изменить переменную на функцию. И как-то я его сломал. Это ниже возвращает undefined, и я не уверен, почему.

Это не работает:

var arrays = [[1, 2, 3], [4, 5], [6]];

function flattened(arr){
  arr.reduce(function(a, b) {
    return a.concat(b);
  });
}
flattened(arrays); //=> undefined

Почему первая функция работает, а вторая нет? Я уверен, что это что-то маленькое, что мне не хватает.


person jward01    schedule 01.08.2015    source источник


Ответы (3)


Потому что функция flattened ничего не возвращает.

function flattened(arr){
  /* “return” needs to be here */ arr.reduce(function(a, b) { // No return from the outer wrapper function “flattened”
    return a.concat(b); // return from the inner function “reduce”
  });
}

Функция внутри него что-то возвращает, но содержащая его функция — нет.

person Sebastian Simon    schedule 01.08.2015
comment
Ах, это имеет смысл!! Спасибо! Я относительно новичок в JS, но быстро учусь. Подобные простые процессы временами сбивают меня с толку. Спасибо! - person jward01; 01.08.2015

Вам нужно return из функции flattened.

function flattened(arr){
  return arr.reduce(function(a, b) {
    return a.concat(b);
  });
}
person Zachary Kuhn    schedule 01.08.2015
comment
Спасибо! Итак, просто для моего понимания ... в моем «сломанном» примере я вернул concat функции сокращения, но я не вернул функцию сокращения в сглаженную функцию? - person jward01; 01.08.2015
comment
@jward01 Не вернул результат reduce/concat, а не сам reduce/concat. - person Andrew Marshall; 01.08.2015

Flattened() должен возвращать значение следующим образом:

var arrays = [[1, 2, 3], [4, 5], [6]];

function flattened(arr){
return arr.reduce(function(a, b) {
  return a.concat(b);
});
}
flattened(arrays);
person Shambhavi    schedule 01.08.2015