数组函数中的 JavaScript 组合



我必须像这样为数组生成组合:

let arr = []
for(let x=1;x<=10;x++) {
for(let y=1;y<=12;y++) {
for(let z=1;z<=16;z++) {
arr.push([x, y, z])
}
}
}
return arr

它正确生成 [[1,1,1], [1,1,2]...[10,12,16]]。

但是,我想使代码看起来和感觉更好。

我尝试尽可能漂亮地转换并使用功能方法(映射、减少等(。

我尝试了 3 张地图,但代码变得更丑了。

尝试使代码减少字符,但不要忽略代码的可读性。

任何答案都是值得赞赏的,如果你愿意,你可以使用lodash/underscore/ramda。

这称为cartesian product

您可以使用ES6功能来实现此目的:reducemap方法。

function cartesianProduct(...array) {
return array.reduce((a, b) =>
a.map(x => b.map(y => x.concat(y)))
.reduce((a, b) => a.concat(b), []), [[]]);
}
function firstN(n){
return Array.from({ length: n }, (_, i) => i + 1)
}
console.log(cartesianProduct(firstN(10), firstN(12), firstN(16)));

这个答案取自这个 SO 答案:

let f = (a, b) => [].concat(...a.map(a => b.map(b => [].concat(a, b))));
let cartesian = (a, b, ...c) => b ? cartesian(f(a, b), ...c) : a;

我认为这就是你要找的

最新更新