Recursive permutations of arrays

by dhchow

HTML

Given n sets of choices: (1,2,3), (2,3,4), (4,5) You pick one element from each set of choices. Generate all possible picking.

(1,2,3)
(2,3,4)
(4,5)

JavaScript

function permutations(sets){
    var result = [];
    if(!arguments.length){
        return [];
    } else if (arguments.length == 1){
        arguments[0].forEach(function(item, index, arr){
            result.push([item])
        })
        return result;
    } else {
        
        var restOfSets = [];
        // loop b/c arguments is not a true array
        for( var i=1; i < arguments.length; i++) {            
            restOfSets.push(arguments[i]);
        }
        var permsTheRest = permutations.apply(this, restOfSets);
        
        for (var f=0; f < arguments[0].length; f++){
            for( var p=0; p < permsTheRest.length; p++) {
                var perms = [arguments[0][f]].concat(permsTheRest[p])
                result.push(perms);
            }
        }
                      
        return result;
    }
    /*return sets.reduce(function(prev, current, index, array){
        return [prev, current];
    })*/
}

//console.log("final (1):")
//console.dir( permutations([11,22,33]));

//console.log("final (2):")
//console.dir( permutations([11,22,33], [222,333,444]) );

var result = permutations([1,2,3],[2,3,4],[4,5]);
console.log("final:")
console.dir( result )
console.log(pp(result))
//console.log(pp(permutations()))
    
function pp(array) {
    console.log("pretty print!")
    array.forEach(function(choices, index, arr){
        console.log(choices.toString())
    })
}