我正在通过learnyouahaskell.com浏览this tutorial,它显示了如何使用以下代码制作三角形列表
Accept: multipart/related,text/html
显然,这会生成(x,y,z)所有可能组合的元组列表(或三元组?),其中x,y和z介于1-10之间。
我认为尝试在Javascript中重现这一点会很有趣,但我没有运气。是否有一种优雅(但可读)的方式在javascript中使用reduce / map等生成它。?
我正在寻找一个数组数组,其中每个子数组包含3个数字。我会发布我的代码,但我甚至没有接近解决这个问题,所以我认为这不会有帮助。
答案 0 :(得分:2)
你好像在寻找今天JavaScript中最接近的list comprehension。理解现在在EcmaScript中处于待命状态,我们不知道它们是否即将推出。但我们有generators。它们不那么性感,但它们可能满足你的需求。
这就是它的样子:
var triangles = (function*(){
for (var i=0; i<10; i++){
for (var j=0; j<10; j++){
for (var k=0; k<10; k++){
yield [i,j,k];
}
}
}
})();
console.log(triangles.next().value); // [0, 0, 0]
console.log(triangles.next().value); // [0, 0, 1]
console.log(triangles.next().value); // [0, 0, 2]
与Haskell一样,你不仅限于有限列表。
你可以像这样迭代:
for (var t of triangles) console.log(t);
(当然,如果你的名单是无限的,你最好在某个时候打破)。
如果你需要一个具体的数组(哪种打破了生成器的美感),那么你可以按照Bergi的建议使用Array.from
:
var triangleArray = Array.from(triangles);
答案 1 :(得分:1)
如果你想以懒惰的方式(生成器)这样做,你可以使用@DenysSeguret's answer。如果要生成包含这些数字的列表列表,可以按如下方式执行此操作:
var triangles = [];
for (var i = 0; i < 10; i++) {
for (var j = 0; j < 10; j++) {
for (var k = 0; k < 10; k++) {
triangles.push([i,j,k]);
}
}
}
这是因为Haskell和JavaScript都是图灵完整语言,所以用Haskell编写的每个程序都可以转换成用JavaScript编写的程序,反之亦然。