なぜかまたcombination
function range(from, to) { var r = []; for( var i = from; i <= to; i++ ) { r.push(i) } return r; } function flatten(a) { return a.reduce( function (head, me) { return head.concat(me); }, []); } function combination(s, n) { if ( n <= 1 ) { return s.map( function(n) [n] ); } else { // n > 2 var r = ( range(0, s.length -1).map( function (i) { var first= s.slice(i, i+1) var ret = combination(s.slice(i+1), n-1); return ret.map( function (n) { return ( first.concat(n) ) } ); } ) ); return flatten(r); } } combination([1,2,3], 1); //[[1], [2], [3]] combination([1,2,3], 2); //[[1, 2], [1, 3], [2, 3]] combination([1,2,3,4,5], 2); //[[1, 2], [1, 3], [1, 4], [1, 5], [2, 3], [2, 4], [2, 5], [3, 4], [3, 5], [4, 5]]
まえよりきれいになった気がする。