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));