◆ ただのJavaScriptのreduceにaccumulator指定できたことを今になって知った

JavaScript の reduce メソッド
[1,2,3,4,5].reduce(function(a, b){
console.log(a, b)
return a + b
})
1 2
3 3
6 4
10 5
(15)  ←返り値
こういう感じに使われます

配列の1つめと2つめを引数してコールバック関数を実行します
その返り値と3つめを引数にしてコールバック関数を実行します
その返り値と4つめを…………

というふうに続いていって配列の最後まで行った時の最終的な返り値が reduce メソッドの返り値になります

実はコールバック関数の第三引数に2つめの引数の配列上のindexが入っていて
第四引数には reduceメソッドを実行した配列自体への参照が入っています


ただ合計を求めるだけだと感じづらいですが 不便なところがあります
reduce を使って配列化をするとします
そのまま reduce を呼び出した配列がそのまま返ってくるとOKということです
[1,2,3].reduce(function(a, b){
return [a].concat(b)
})
では 2回目以降が無駄にネストした配列になってしまいます
[1,2,3].reduce(function(a, b){
return a.concat(b)
})
では1回目が 配列じゃないのでエラーですし 最初の要素が配列だったとしてもそれは構造が変わってしまうのでよくないです

1回目だけ別に分岐させて
[1,2,3].reduce(function(a, b, idx){
return idx === 1 ? [a,b] : a.concat(b)
})
と書くことになります

分岐させるのめんどくさい

初期値が渡せれば [] を初期値にしてコールバック関数では 追加するだけで済むのに……


ライブラリ使ってないタダのJavaScriptだと accumulator(初期値) 設定できないから自分で 1つめに初期値を入れるしかないので
var a = [1,2,3].slice()
a.unshift([])
a.reduce(function(a, b, idx){
return a.concat(b)
})
なんか

というわけで自分で 内部的に↑をする関数を fold とか別名で作るか 外部ライブラリを使っていました


ですが 最近ふと reduce を調べたら
array.reduce(callback[, initialValue]);
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce

え?? initialValue いけたの?

初期値を書くとしたら ココ以外に書くところはないですし さすがに自分でもできないかは一回は確かめたはず たぶん

もしかして ecma6 とかで増えたとか 最近になってChromeで実装されたとか?

これが使えたなら 余計な苦労しなくて済んだことが多かったのにーーー!!
ここ最近の一番の衝撃的な発見でした。