2016-01-13 35 views

回答

2

既然你问了“更快”,它看起来像你可以通过创建一个单一的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%。

enter image description here

7

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

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

jsperf测试:http://jsperf.com/fill-array-matrix

+0

注填()不完全支持。 – epascarello

+0

我认为这也会比OPs代码慢,但它是可比的。 – Paulpro

+1

OP的注意事项:'.fill()'还没有得到普遍支持。在IE或iOS7中似乎没有支持,在Android中也不是很好的支持。你可以使用polyfill,但不要指望polyfill速度很快。所以,基本上这可以加速你在Chrome,Firefox和Edge上的速度。 – jfriend00

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); 
+0

您的代码显示10的长度,但您声明1000x1000。我认为你需要发布你的测量技术来相信阵列填充是0ms,你的解决方案是4ms和1492ms的双'for'循环。这对我来说似乎太大不同了。如果是这样,很好。但是,没有更多的文件,这有点难以置信。 – jfriend00

+0

谢谢。您的解决方案和@ jfriend00的运行时间几乎相同。 – SaadH