[1,2,3].x(2) -> [1,2,3,1,2,3]
id:reinyannyan:20060427:p1 で、写真の額縁をランダムに五つ並べる、ということを表そうとしたんですが、
['random', 'random', 'random', 'random', 'random']
と書くのはあまりに格好悪いなと思いました。そこで、Ruby の配列の乗算メソッド (*) と同様のものを "x" として実装してみました。
Array.prototype.x = function (x) { if (isNaN(x)) return this.join(x); var result = []; while (x-- > 0) result.push.apply(result, this); return result; };
引数が文字列の場合 (例では、数値でなかった場合) は join する、という挙動は Ruby に倣っています。
push.apply というややトリッキーなことをしていますが、単純に push すると、
[1,2,3,[1,2,3]]
という状態になってしまいますので、apply を使って展開する必要があるのです。「concat 使えば?」:
result = result.concat(this);
と思うところなんですが、計測の結果 push の方が圧倒的に速かったため、速い方を使いました。