Javascript Reduz um array vazio

104

Quando reduzo a matriz, estou tentando obter o número zero, mas não entendo claramente o comportamento da função

[].reduce(function(previousValue, currentValue){
  return Number(previousValue) + Number(currentValue);
});

resultado

TypeError: Reduce of empty array with no initial value

parece que se o array está vazio eu não posso reduzi-lo

[""].reduce(function(previousValue, currentValue){
  return Number(previousValue) + Number(currentValue);
});

resultado

""

Se o único elemento da matriz for uma string vazia, recupera uma string vazia

agusgambina
fonte

Respostas:

228

O segundo parâmetro é para o valor inicial.

[].reduce(function(previousValue, currentValue){
  return Number(previousValue) + Number(currentValue);
}, 0);

ou usando ES6:

[].reduce( (previousValue, currentValue) => previousValue + currentValue, 0);
xdazz
fonte
24

Ambos os comportamentos estão de acordo com as especificações .

Você não pode reduceuma matriz vazia, a menos que forneça explicitamente um valor inicial "acumulado" como o segundo argumento:

Se nenhum initialValue foi fornecido, previousValue será igual ao primeiro valor na matriz e currentValue será igual ao segundo. É um TypeError se a matriz não contiver elementos e initialValue não for fornecido.

Se a matriz tiver pelo menos um elemento, fornecer um valor inicial é opcional. No entanto, se nenhum for fornecido, o primeiro elemento da matriz será usado como o valor inicial e reducecontinuará a processar o restante dos elementos da matriz invocando seu retorno de chamada. No seu caso, o array contém apenas um único elemento, de modo que esse elemento se torna o valor inicial e também o valor final, uma vez que não há mais elementos a serem processados ​​através do callback.

Jon
fonte