Vi Veri Veniversum Vivus Vici
var a = [ ['a', 'b', 'c'], ['e', 'f'], ['g', 'h', 'i', 'j'], ['k'] ]; var f = function (data, i) { var result = [], tmp, j, k, variants; // start from 0 index of data at function launch if index wasn't passed i = i || 0; // in case i is greater then array bound, just return empty array if (i < data.length) { for (j = 0; j < data[i].length; j++) { variants = f(data, i + 1); // if there aren't variants, just create array of one element which is empty array itself if (!variants.length) { variants = [ [] ]; } for (k = 0; k < variants.length; k++) { // concat variants and current iterable element tmp = [data[i][j]].concat(variants[k]); result.push(tmp); } } } return result; } console.log(f(a));