Hatena::Groupptech

ぷちてく RSSフィード

Archive
 
ProfileProfile

2012-07-13

要件低めなArray.flatten

18:59

どーもこんちわ。少し間が空いちゃったけど前のエントリで取り上げた直後に元祖っぽいのを見つけてたから投下しておこ

JavaScript 1.6版

id:nanto_vi さんが2005年に投下してたもの

応用すれば多元配列を一元配列に変換することもできるなと思った次第。どういうときに使えるのかは思い浮かばないけど。

Array.prototype.flatten = function () {
  var element = (arguments.length == 0) ? this : arguments[0];
  return (element instanceof Array)
         ? Array.prototype.concat.apply([],
             Array.map(element, arguments.callee))
         : element;
}

[0, 1, [[]], [2, 3], [4, [[5], [], 6, [7, 8], 9]]].flatten()
// => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
多元配列を一元配列に変換 (JavaScript): Days on the Moon

Array.mapさえ使えればいいから、JavaScript 1.6相当。じぶんが書いたECMAScript 5相当のより要件的に使いやすいはず。

flattenの出自自体は知らないんだけど、JSならprototype.jsあたりで、そもそもはRubyとかその元ネタで拾ってるPerlあたりからきたかな?

どんなときArray.flatten?

引用したようにnanto_vi さんも2005年エントリの時点では「使い道が?」って感じだったぽい。座標系変換とかVector演算的なことをする人は使いそうだけど、普段使ったこと無い・・

Tenでの利用例

はてなのTen内部だとTen.Selector.getElementsBySelector()とかから使われてて、こんなかんじ

/* Ten.Selector */
Ten.Selector = new Ten.Class({
    initialize: function(selector) {
//...
    },
    getElementsBySelector: function(selector, parent) {
        var sels = selector.split(/\s*,\s*/);
        var ret = [];
        for (var i = 0; i < sels.length; i++) {
            var sel = new Ten.Selector(sels[i]);
            ret = ret.concat(sel.getElements(parent));
        }
        ret = Ten.Array.flatten(ret); // ←ここ
        return ret;
    }
},{
//...
http://s.hatena.ne.jp/js/HatenaStar.js

セレクタで取得してきたノードツリーをフラットにするのに使ってるみたいだね。なるほど

トラックバック - http://ptech.g.hatena.ne.jp/noromanba/20120713

Copylight (c) noromanba 2012-2017