这也被称为“深度复制”,我已经找到了一些文章。最接近的似乎是这个,但它适用于 jQuery - 我正在尝试在没有库的情况下执行此操作。
我还在两个地方看到可以执行以下操作:
arr2 = JSON.decode(JSON.encode(arr1));
但这显然是低效的。也可以单独循环和复制每个值,并在所有数组中重复。这似乎也很累而且效率低下。
那么复制 JavaScript 多维数组的最有效、非库方法是[[a],[b],[c]]什么?如有必要,我对“非 IE”方法非常满意。
谢谢!
这也被称为“深度复制”,我已经找到了一些文章。最接近的似乎是这个,但它适用于 jQuery - 我正在尝试在没有库的情况下执行此操作。
我还在两个地方看到可以执行以下操作:
arr2 = JSON.decode(JSON.encode(arr1));
但这显然是低效的。也可以单独循环和复制每个值,并在所有数组中重复。这似乎也很累而且效率低下。
那么复制 JavaScript 多维数组的最有效、非库方法是[[a],[b],[c]]什么?如有必要,我对“非 IE”方法非常满意。
谢谢!
由于听起来您正在处理某个未知深度级别的数组数组,但您只需要在任何给定时间在一个深度级别上处理它们,那么它的使用将变得简单快捷.slice()。
var newArray = [];
for (var i = 0; i < currentArray.length; i++)
newArray[i] = currentArray[i].slice();
或使用.map()而不是for循环:
var newArray = currentArray.map(function(arr) {
return arr.slice();
});
所以这会迭代当前的数组,并构建一个新的嵌套数组的浅拷贝数组。然后当你进入下一个深度层次时,你会做同样的事情。
当然,如果混合了数组和其他数据,您需要在切片之前测试它是什么。
我不确定JSON.stringifyandJSON.parse比encodeand好多少decode,但是您可以尝试:
JSON.parse(JSON.stringify(array));
我发现的其他东西(虽然我会稍微修改一下):
http://www.xenoveritas.org/blog/xeno/the-correct-way-to-clone-javascript-arrays
function deepCopy(obj) {
if (typeof obj == 'object') {
if (isArray(obj)) {
var l = obj.length;
var r = new Array(l);
for (var i = 0; i < l; i++) {
r[i] = deepCopy(obj[i]);
}
return r;
} else {
var r = {};
r.prototype = obj.prototype;
for (var k in obj) {
r[k] = deepCopy(obj[k]);
}
return r;
}
}
return obj;
}
当您要求性能时,我想您也会使用非通用解决方案。要复制具有已知级别数的多维数组,您应该使用最简单的解决方案,即一些嵌套的 for 循环。对于您的二维数组,它看起来像这样:
var len = arr.length,
copy = new Array(len); // boost in Safari
for (var i=0; i<len; ++i)
copy[i] = arr[i].slice(0);
要扩展到更高维数组,请使用递归或嵌套 for 循环!
本机slice方法比自定义 for 循环更有效,但它不会创建深层副本,因此我们只能在最低级别使用它。
任何不访问同一个节点两次的递归算法都将与使用 javascript(至少在浏览器中)一样有效 - 在其他语言的某些情况下,您可能会避免复制内存,但 javascript 显然没有没有那个能力。
我建议找一个已经做过的人,并使用他们的实现来确保你做对了——它只需要定义一次。