@extra-array/cartesian-product
Version:
Lists cartesian product of arrays.
29 lines (28 loc) • 667 B
JavaScript
;
function id(v) {
return v;
}
function cartesianProduct(xs, fm = null) {
var fm = fm || id;
var X = xs.length, a = [];
if (X === 0)
return a;
var is = new Array(X).fill(0);
var ls = xs.map(x => x.length);
if (ls.some(l => l === 0))
return a;
for (var i = 0;; i++) {
for (var j = 0, vs = []; j < X; j++)
vs.push(xs[j][is[j]]);
a.push(fm(vs, i, null));
for (var r = X - 1; r >= 0; r--) {
if (++is[r] < ls[r])
break;
is[r] = 0;
}
if (r < 0)
break;
}
return a;
}
module.exports = cartesianProduct;