javascript - 数组函数中的 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。
解决方案
那就是所谓的cartesian product
。
您可以使用ES6
特性来实现这一点:reduce
和map
方法。
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)));
推荐阅读
- python - 在 Python 中查找具有不同输出列表长度的不同列表的所有可能组合(不是重复的)
- java - testng.xml 没有运行来自不同包的多个类
- android - 使用带有 rxjava 的改造来访问动态 url 时出现意外的 JDWP 错误:103
- linux - 直到循环,但如果在 5 分钟后失败,如何超时
- aframe - Aframe:物理+动画
- reactjs - 网格和蚂蚁设计
- python - 输入矩阵的值后无法跳出 while 循环
- javascript - React:如何在事件发生时获取新日期
- android - 如何在 android 中创建如下图所示的布局以及 android 布局中的 alpha 是什么
- ruby-on-rails - 如何在 Rails 5 中全面诊断测试环境问题