Javascript中的矩阵预分配

时间:2015-07-05 02:26:21

标签: javascript

我一直在玩使用画布生成图像滤镜,我试图通过从头开始预分配整个矩阵来提高速度。

这段代码是我尝试过的第一件事:

var N = 3
var matrix = new Array(N).map(function () { return new Array(N) })
// [ undefined x 3 ]

不幸的是,这并没有达到我的预期。

我的预期结果由以下代码给出:

N = 3;
matrix = [undefined,undefined,undefined].map(function () { return new Array(N) })
// [Array[3], Array[3], Array[3]]

显然,预分配可以用另一种方式完成。这似乎可能是因为在javascript的实现中为了性能而进行了一些切角。

任何人都知道为什么第一个例子与第二个例子没有做同样的事情?

环境检查:

操作系统:OSX Yosemite

浏览器:Chrome,Firefox Dev(两者都相同)

1 个答案:

答案 0 :(得分:3)

问题是new Array(n)以及Array(n)which are equivalent)会创建稀疏数组。不幸的是,functions like .forEach and .map do not iterate over sparse sections of arrays,这就是为什么你会看到这种行为。

您可以使用trick来初始化特定大小的密集数组:

> var arr = Array.apply(null, {length: N});
> console.log(arr);
[undefined, undefined, undefined]

一旦你有一个密集阵列,你可以正确使用.map

var matrix = Array.apply(null, {length: N}).map(function() {
    return Array.apply(null, {length: N});
});