ディープコピーと同様に考えるとflattenは:
- 初期値[]のアキュムレータに配列の要素を順に連結していく(reduce)。
- もし配列の要素が配列なら、要素をさらにflatにしてから連結(concat)。
- そうでないなら要素をそのまま連結。
アロー関数で書くと:
const flatten =
xs => xs.reduce(
(acc, e) => Array.isArray( e ) ? acc.concat( flatten( e ) )
: acc.concat( e )
,[]
)
flatten([ 1, [ 2, 3 ], [ [ 4, 5 ], 6 ] ])
=> [ 1, 2, 3, 4, 5, 6 ]
参照:
Greedy flatten function for Array in JavaScript
function式で書かれている。中味は同じ。
あるいはスプレッド構文を使って
const flatten =
xs => xs.reduce(
(acc, e) => Array.isArray( e ) ? [...acc, ...flatten( e )]
: [...acc, e ]
,[]
)
こっちの方が直観的かも。見慣れれば。