Использование функции reduce для возврата массива

почему, когда я хочу использовать функцию push внутри функции reduce для возврата нового массива, я получаю ошибку. Однако, когда я использую метод concat внутри функции reduce, он возвращает новый массив без проблем.

все, что я пытаюсь сделать, это передать массив функции reduce и вернуть тот же массив.

var store = [0,1,2,3,4];

var stored = store.reduce(function(pV,cV,cI){
  console.log("pv: ", pV);
  return pV.push(cV);
},[]);

Это возвращает ошибку. Но когда я использую конкатенацию:

var store = [0,1,2,3,4];

var stored = store.reduce(function(pV,cV,cI){
  console.log("pv: ", pV);
  return pV.concat(cV);
},[]);

он возвращает тот же массив.

любые идеи почему?

4 ответов


push возвращает новую длину массива.

вам нужен первоначально предоставленный массив.

поэтому измените код, как показано ниже.

var store = [0, 1, 2, 3, 4];

var stored = store.reduce(function(pV, cV, cI){
  console.log("pv: ", pV);
  pV.push(cV);
  return pV; // *********  Important ******
}, []);

concat возвращает новый массив, объединяющий элементы предоставленного массива и объединенные элементы. так это работает.


просто для полноты, и для следующего человека, который происходит по этому вопросу, то, что вы делаете, обычно достигается с map который, как указано в документах

map вызывает предоставленную функцию обратного вызова один раз для каждого элемента в массиве по порядку и создает новый массив из результатов

сравните это с описанием reduce:

метод reduce () применяет функция против аккумулятора и каждое значение массива (слева направо), чтобы уменьшить его до одного значения.

(акцент мой) так что вы видите, хотя вы можете манипуляции reduce чтобы вернуть новый массив, обычно используется сокращение массива до одного значения.

Итак, для вашего кода это будет:

var store = [0,1,2,3,4];

var stored = store.map(function(pV){
  console.log("pv: ", pV);
  return pV;
});

гораздо проще, чем пытаться восстановить новый массив, используя либо push или concat в пределах a


массив.прототип.толкай!--2--> метод возвращает новую длину массива.

массив.прототип.функция concat метод вставляет новый элемент в массив и возвращает массив обратно, чтобы его можно было дополнительно обработать. Это то, что вам нужно сделать с reduce: передать измененный массив на следующую итерацию.


снижение может быть полезно, если вам нужно вернуть массив с несколькими элементами для каждого элемента итерации;

var inputs = media.reduce((passedArray, video) => { passedArray.push("-i"); passedArray.push(video.filepath); return passedArray; }, []);

здесь он используется для создания входного массива для ffmpeg;

[{ имя: "Вася", путь: "1.МР4" }, { имя: "Сью", путь: "3.МР4" }]

=> ["- i", " 1.mp4", "- i", " 2.mp4]