重置多维数组的最快方法?

chr*_*ode 9 javascript arrays algorithm performance multidimensional-array

假设我有一个二维数组:vectors[x][y],初始数组结构如下所示:

vectors = [    
 [0, 0, 0, 0, 0,],
 [0, 0, 0, 0, 0,],
 [0, 0, 0, 0, 0,],
 [0, 0, 0, 0, 0,],
 [0, 0, 0, 0, 0,]
]
Run Code Online (Sandbox Code Playgroud)

经过一些计算,数组中的数据是随机的.将数组返回到初始状态的最快方法和最有效的方法是什么?

我知道我可以硬编码上面的归零数组并再次设置等于它的向量,但我也知道一个算法如:

for (var x = 0; x < vectors.length; x++) {
    for (var y = 0; y < vectors[x].length; y++) {
        vectors[x][y] = 0;
    }

}
Run Code Online (Sandbox Code Playgroud)

是O(x*y).

那么哪种方式更好?是否有更好,更快/更有效的方法来解决这个问题?

对于将任意长度的多维数组归零的一般情况,这是最好的方法吗?(如果重要,我正在使用JavaScript)

cba*_*ram 3

这是我的两分钱:

我会保留原始数组的干净副本以获得最快的性能。您可以保留引用的硬编码副本

var vectorsOrig = [    
 [0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0]
];
Run Code Online (Sandbox Code Playgroud)

或使用切片对初始数组进行动态干净克隆((在您的情况下递归进行深层复制):

var clonedVectors = [0, 0, 0, 0, 0].slice(0);
Run Code Online (Sandbox Code Playgroud)

无论如何,采用将矢量引用重置为原始副本的方法将比循环并重置每个节点更快。如果旧的向量数组对象不再被引用,JavaScript 将对其进行垃圾收集。

话虽如此,问题就变成了每次都获得一份干净的副本。拥有一次硬编码实例将为您提供一份干净的副本,此后您必须克隆它。您也不想通过与重置选项类似的 for 循环进行动态生成。我的建议是编写一个克隆函数,它只返回一个新的硬编码或初始化的数组:

function newVector() {
    return [    
     [0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0],
     [0, 0, 0, 0, 0]
    ];
}
var vector = newVector();
vector[1][2] = 11;
console.dir(vector);
vector = newVector();  // your old array will be garbage-collected if no longer referenced by any other reference
console.dir(vector);
Run Code Online (Sandbox Code Playgroud)

理想情况下,最好对各种方法进行基准测试。

编辑 感谢 Vega 的输入,我修改了他的测试来测试三种方法。在Chrome和IE9中,这个解决方案似乎是最快的,在FF(15.0.1)中手动迭代似乎更快(FF中的内存分配/管理可能更慢)。http://jsperf.com/array-zero-test/2