JavaScript:更快速地创建和初始化二维数组(矩阵)

时间:2016-01-13 18:01:35

标签: javascript arrays

是否有更快的方法来创建和清零矩阵? 目前,我的代码涉及两个for循环:

var nodes = new Array(ast.length);

for (var i=0; i < nodes.length; i++){
    nodes[i] = new Array(ast.length);
    for (var j=0; j < nodes.length; j++)
        nodes[i][j]=0;
}

4 个答案:

答案 0 :(得分:10)

您可以使用Array.prototype.fill方法:

var nodes = Array(ast.length).fill(Array(ast.length).fill(0));

jsperf test:http://jsperf.com/fill-array-matrix

答案 1 :(得分:2)

您可以创建一次零数组并创建它的副本:

var length = 10;

var zeros = Array.apply(null, Array(length)).map(Number.prototype.valueOf, 0);
var nodes = zeros.map(function(i) {
    return zeros.slice();
});

console.log(nodes);

答案 2 :(得分:2)

由于您要求“更快”,看起来您可以通过创建单个初始化数组然后使用.slice()复制它而不是初始化每个数组本身来获得一些速度:

var nodes = new Array(ast.length);
var copy = new Array(ast.length);
for (var i = 0; i < ast.length; i++) {
    copy[i] = 0;
}

for (var i=0; i < nodes.length; i++){
    nodes[i] = copy.slice(0);
}

jsperf test:http://jsperf.com/slice-vs-for-two-d-array/2

在所有三种主流浏览器中,此方法的速度要快10-20%。

enter image description here

答案 3 :(得分:0)

我不知道生成二维数组的速度有多快,但是恕我直言,这是大多数情况下更好的方法。

Array.prototype.dim = function(){
    if( this.length==2 ){
        r=this.shift(); c=this.shift();
        while( r-- ) this.push( new Array( c ).fill(0,0) );
        return this;
    }
}

在使用中,二维数组是通过使用x,y或rows,cols作为两个参数初始化常规的1d数组而制成的。然后将它们用于标注数组的尺寸并同时用零填充。

var arr = new Array(5,7).dim();
console.log(arr[4]);

然后,数组具有所需的零维。

输出:

console.log(arr[4]);
 (7) [0, 0, 0, 0, 0, 0, 0]

我希望有人觉得这有用。