2013-12-17 64 views
5

我试图切换到功能性编程,并希望使用下划线的JavaScript。下划线功能javascript

但我卡在第一基地。我不能在所有创建一个数组,并采取命令式语言,我似乎不能正确地变换他们要么:n.length是正确的,但N [0]。长度是不确定的(见fiddle

var a = new Array(5); 
for (i = 0; i < a.length; i++) { 
    a[i] = new Array(6); 
} 
var n = _.map(a, function (row, rowIdx) { 
    _.map(row, function(col, colIdx) { 
     return rowIdx * colIdx 
    }); 
}); 

console.log(a.length) 
console.log(n.length) 
console.log(a[0].length); 
console.log(n[0].length); 
+0

你究竟想要做什么?创建一个乘法矩阵? – rossipedia

+0

不,我打算把其他东西放在矩阵中,但我只是用它作为解释我想要做什么的简单方法 –

+0

有人添加了一条评论,我需要在第二个_.map之前添加return,然后他们将其删除。我想在这里记录这个智慧 –

回答

3

为“功能性”创建使用下划线一个5×6矩阵,你可以做这样的事情:

var matrix = _.range(5).map(function (i) { 
    return _.range(6).map(function (j) { 
     return j * i; 
    }); 
}); 

_.range功能(documentation)是用于创建填充有连续的数字阵列的缩写。例如,_.range(5)返回数组[0,1,2,3,4]。范围从零开始。

如果你不想使用_.range,您可以用原始的JavaScript使用数组文本做到这一点:

var matrix = [0,1,2,3,4].map(function (i) { 
    return [0,1,2,3,4,5].map(function (j) { 
     return j * i; 
    }); 
}); 
3

另一种方式来创建一个矩阵是使用_.times:

var matrix = _.times(6, function(x){ 
    return _.times(7, function(y){ 

     // do whatever needs to be done to calculate the value at x,y 

     return x + ',' + y; 
    }); 
}); 
0

在ES6/2015

var range = num => Array.apply(null, Array(num)).map((i, n) => n); 
 

 
var matrix2d = (a1, a2) => a1.map(i => a2.map(j => [i, j])); 
 

 
console.log(matrix2d(range(5), range(6)));