JSFiddle - React, Tailwind, and code Playground

by Yuriy Tarabanko

JavaScript

function copy(to, from) {
    Object.keys(from).forEach(function(key){
        to[key] = from[key];
    });
    return to;
}
function permutate(arrays, keys, memo) {
    var options, name;
    
    if(keys.length ) {
        name = keys.shift();
        options = arrays[name];
        memo = memo || [{}];
        return permutate(arrays, keys, options.reduce(function(accumulator, item){
            return accumulator.concat(memo.map(function(curr){
                var result = copy({}, curr);
                result[name] = item;
                return result;
            }));
        }, []));
    }
    
    return memo;
}

function chars(str) {
    return str.split('');    
}

console.log(permutate({abc: chars('abc'), '1234': chars('1234'), xyz: chars('xyz')}, ['abc', '1234', 'xyz']));