function combinations(arr, k){ var i, subI, ret = [], sub, next; for(i = 0; i < arr.length; i++){ if(k === 1){ ret.push( [ arr[i] ] ); }else{ sub = combinations(arr.slice(i+1, arr.length), k-1); for(subI = 0; subI < sub.length; subI++ ){ next = sub[subI]; next.unshift(arr[i]); ret.push( next ); } } } return ret; } combinations([0,1,2,3,4], 3); // produces: [[0, 1, 2], [0, 1, 3], [0, 1, 4], [0, 2, 3], [0, 2, 4], [0, 3, 4], [1, 2, 3], [1, 2, 4], [1, 3, 4], [2, 3, 4]] combinations(["Crosby", "Stills", "Nash", "Young"], 3); // produces: [["Crosby", "Stills", "Nash"], ["Crosby", "Stills", "Young"], ["Crosby", "Nash", "Young"], ["Stills", "Nash", "Young"]]