有没有更快的方法来创建和清零矩阵?
目前,我的代码涉及两个for循环:JavaScript:创建和初始化二维数组(矩阵)的更快方法
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;
}
有没有更快的方法来创建和清零矩阵?
目前,我的代码涉及两个for循环:JavaScript:创建和初始化二维数组(矩阵)的更快方法
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;
}
既然你问了“更快”,它看起来像你可以通过创建一个单一的initalized阵列,然后使用.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测试:http://jsperf.com/slice-vs-for-two-d-array/2
这种方法在所有三种主流浏览器中看起来要快10-20%。
你可以使用Array.prototype.fill方法:
var nodes = Array(ast.length).fill(Array(ast.length).fill(0));
jsperf测试:http://jsperf.com/fill-array-matrix
注填()不完全支持。 – epascarello
我认为这也会比OPs代码慢,但它是可比的。 – Paulpro
OP的注意事项:'.fill()'还没有得到普遍支持。在IE或iOS7中似乎没有支持,在Android中也不是很好的支持。你可以使用polyfill,但不要指望polyfill速度很快。所以,基本上这可以加速你在Chrome,Firefox和Edge上的速度。 – jfriend00
您可以一次创建零的阵列,并创建副本其中:
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);
重复的 - http://stackoverflow.com/q/6495187/104380 – vsync