Skip to content

Instantly share code, notes, and snippets.

@solova
Created February 21, 2018 10:41
Show Gist options
  • Save solova/49a7955fe2ff6ee2beeb829c66c05e45 to your computer and use it in GitHub Desktop.
Save solova/49a7955fe2ff6ee2beeb829c66c05e45 to your computer and use it in GitHub Desktop.
Fast cartesian product JS
function cartesian() {
const N = arguments.length;
var arr_lengths = Array(N);
var digits = Array(N);
var num_tot = 1;
for (var i = 0; i < N; ++i) {
const len = arguments[i].length;
if (!len) {
num_tot = 0;
break;
}
digits[i] = 0;
num_tot *= (arr_lengths[i] = len);
}
var ret = Array(num_tot);
for (var num = 0; num < num_tot; ++num) {
var item = Array(N);
for (var j = 0; j < N; ++j) { item[j] = arguments[j][digits[j]]; }
ret[num] = item;
for (var idx = 0; idx < N; ++idx) {
if (digits[idx] == arr_lengths[idx] - 1) {
digits[idx] = 0;
} else {
digits[idx] += 1;
break;
}
}
}
return ret;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment