rep(any, num)
昨日のやつを一般化してみた。
function rep(any, num){ var o = any, n = num | 0, O = {}; if(n > 1) switch(O.toString.call(o).slice(8, -1)){ case 'String': { var r = ''; do if(n & 1) r += o; while((n >>= 1) && (o += o)); return r } case 'Array': { var r = [], p = r.push; do if(n & 1) p.apply(r, o); while((n >>= 1) && (o = o.concat(o))); return r } case 'Function': { var r = function(x){ return x }, f = function(x){ return o(x) }; do if(n & 1) r = (function(r, f){ return function(x){ return r(f(x)) }})(r, f); while((n >>= 1) && (f = (function(f){ return function(x){ return f(f(x)) }})(f))); return r } case 'RegExp': { var f = '', p = {global:'g',ignoreCase:'i',multiline:'m',sticky:'y'}; for(var k in p) if(!O[k] && o[k]) f += p[k]; return RegExp(rep(o.source, n), f) } case 'Number': return o * n; } return any; }
繰り返せそうに無いものはそのまま。Function
のとこがカオス。