首页 > 解决方案 > 数组函数中的 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]]。

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

我尝试尽可能漂亮地进行转换并使用函数式方法(map、reduce 等)。

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

尽量减少代码的字符,但不要忽视代码的可读性。

任何答案表示赞赏,如果您愿意,可以使用 lodash/underscore/ramda。

标签: javascriptfunctional-programming

解决方案


那就是所谓的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)));


推荐阅读