Как применить метод Reduce для объектов в JavaScript? - PullRequest
0 голосов
/ 03 июня 2018

Я читал о методе приведения массивов в JavaScript и нашел следующий пример в документах MDN Web:

var initialValue = 0;
var sum = [{x: 1}, {x:2}, {x:3}].reduce(
    (accumulator, currentValue) => accumulator + currentValue.x
    ,initialValue
);

console.log(sum) // logs 6

Когда я запускал это, я получал в результате не "6", а "[объект Object] 710"

Но когда я его запускалв фрагменте Stackoverflow я получил "6".

Что не так?

1 Ответ

0 голосов
/ 03 июня 2018

Когда начальное значение не указано, первая итерация использует 0-й элемент как accumulator, а 1-й элемент как currentValue.Это будет работать для суммирования массива чисел и нескольких других полезных случаев.

var reducer = ( acc, val ) => {
    console.log( acc, val );
    return acc + val;
})

[ 1, 2, 3 ].reduce( reducer )
-> 1, 2
-> 3, 3

[ 1, 2, 3 ].reduce( reducer, 0 )
-> 0, 1
-> 1, 2
-> 3, 3

Другими словами, опускание начального значения в вашем случае похоже на выполнение:

[{x: 2}, {x: 3}].reduce( ( acc, val ) => acc + val.x, {x: 1} );

Поэтому первая итерация оценивается как {x: 1} + 2.

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

...