reduceの初期値

配列['apple', 'orange', 'grape']を以下のhtmlに変換する.実行したのはGoogle Apps Script.

<ol><li>apple</li><li>orange</li><li>grape</li></ol>

結論

JavaScriptのソースは以下の通り.reduceの第2引数(初期値)として空文字列''を指定する必要がある.

var html='<ol>'+['apple', 'orange', 'grape'].reduce(function(acc, val){return acc+'<li>'+val+'</li>'}, '')+'</ol>';
Logger.log(html);

reduceに渡しているコールバック関数への引数(acc,val)と返却値の遷移は以下の通り.

1回目 acc: '', val: 'apple', 返却値: '<li>apple</li>'
2回目 acc: '<li>apple</li>', val: 'orange', 返却値: '<li>apple</li><li>orange</li>'
3回目 acc: '<li>apple</li><li>orange</li>, val: 'grape', 返却値: '<li>apple</li><li>orange</li><li>grape</li>'
最終結果 '<ol><li>apple</li><li>orange</li><li>grape</li></ol>'

試してみた

初期値を与えないと配列の最初の項目appleliタグで囲めない.

var html='<ol>'+['apple', 'orange', 'grape'].reduce(function(acc, val){return acc+'<li>'+val+'</li>'})+'</ol>';
Logger.log(html);

1回目 acc: 'apple', val: 'orange', 返却値: 'apple<li>orange</li>'
2回目 acc: 'apple<li>orange</li>, val: 'grape', 返却値: 'apple<li>orange</li><li>grape</li>'
最終結果: '<ol>apple<li>orange</li><li>grape</li></ol>'

ちなみに

数値の配列を文字列として結合する際も初期値を指定する.

Logger.log([1, 2, 3].reduce(function(acc, val){return acc+val}, ''));
// 123

初期値がないと合計値になる.

Logger.log([1, 2, 3].reduce(function(acc, val){return acc+val}));
 // 6.0