それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

Javascriptのiterationを使ってFlatten

前回まとめたiterator 系の機能map/reduce/each系を上手に使えば、flatten も作れる。このへんはrubyと同じで行けて嬉しいね。

flattenするのも楽ちんだよ。

> [[1],[2],[3],[4]].reduce(function(v,e){ return v.concat(e) },[])
[ 1, 2, 3, 4 ]
>

Array#flatten

上記の例だと、再帰処理しないので、再帰処理追加してOK

Array.prototype.flatten = function() {
  var a = this.reduce( function(e,v){
    if ( v instanceof Array ) {
      v = v.flatten();
    }
    e = e.concat(v);
    return e;
  
  
  } ,[] );
  return a;
}
> [[1],[2],[3],[[4]]].flatten()
[ 1, 2, 3, 4 ]

prototypeを使えば結構楽ちんですね。JavaScriptのIteration拡張素晴らしいです。

使いやすく修正

Array.prototype.flatten = function() {
  return this.reduce((e,v)=>e.concat(v.flatten==this.flatten ? v.flatten():v),[])
}

2014-05-14 追加

flatten を再帰的にした。

2017/12/22 修正

Chromeのコンソールからコピーしたコードが間違ってたので修正