Javascript Mengurangi larik kosong

104

Ketika saya mengurangi larik, saya mencoba mendapatkan angka nol, tetapi saya tidak memahami perilaku fungsi dengan jelas

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

hasil

TypeError: Reduce of empty array with no initial value

Tampaknya jika array kosong saya tidak bisa menguranginya

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

hasil

""

Jika satu-satunya elemen dalam array adalah string kosong, ambil string kosong

agusgambina.dll
sumber

Jawaban:

228

Parameter kedua adalah nilai awal.

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

atau menggunakan ES6:

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

Kedua perilaku tersebut sesuai dengan spesifikasi .

Anda tidak dapat reducememasukkan array kosong kecuali Anda secara eksplisit memberikan nilai "akumulasi" awal sebagai argumen kedua:

Jika tidak ada initialValue yang diberikan, maka beforeValue akan sama dengan nilai pertama dalam larik dan currentValue akan sama dengan nilai kedua. Ini adalah TypeError jika array tidak berisi elemen dan initialValue tidak disediakan.

Jika array memiliki setidaknya satu elemen, maka memberikan nilai awal adalah opsional. Namun, jika tidak ada, elemen pertama dari array akan digunakan sebagai nilai awal dan reduceterus memproses elemen array lainnya dengan memanggil callback Anda. Dalam kasus Anda, array hanya berisi satu elemen, sehingga elemen tersebut menjadi nilai awal dan juga nilai akhir, karena tidak ada lagi elemen yang akan diproses melalui callback.

Jon
sumber