1. var a = [
  2. ['a', 'b', 'c'],
  3. ['e', 'f'],
  4. ['g', 'h', 'i', 'j'],
  5. ['k']
  6. ];
  7.  
  8. var f = function (data, i) {
  9. var result = [],
  10. tmp,
  11. j, k,
  12. variants;
  13. // start from 0 index of data at function launch if index wasn't passed
  14. i = i || 0;
  15. // in case i is greater then array bound, just return empty array
  16. if (i < data.length) {
  17. for (j = 0; j < data[i].length; j++) {
  18. variants = f(data, i + 1);
  19. // if there aren't variants, just create array of one element which is empty array itself
  20. if (!variants.length) {
  21. variants = [
  22. []
  23. ];
  24. }
  25. for (k = 0; k < variants.length; k++) {
  26. // concat variants and current iterable element
  27. tmp = [data[i][j]].concat(variants[k]);
  28. result.push(tmp);
  29. }
  30. }
  31. }
  32. return result;
  33. }
  34.  
  35. console.log(f(a));