这也被称为“深度复制”,我找到了一些文章。最接近的似乎是这个,但它是针对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();
});
这将迭代当前数组,并构建一个新的由嵌套数组的浅拷贝组成的数组。然后当您进入下一层深度时,您会做同样的事情。
当然,如果存在混合数组和其他数据,则需要在切片之前测试其类型。
.slice(0)
来克隆一个数组。使用.slice()
也可以,但是.slice(0)
更快。 - Trung Le Nguyen Nhatvar newArray = currentArray.map(arr => arr.slice());
- Matt Pengelly我不确定JSON.stringify
和JSON.parse
相比encode
和decode
有多大的优势,但您可以尝试:
JSON.parse(JSON.stringify(array));
我发现了另外一个东西(虽然我会稍作修改):
http://www.xenoveritas.org/blog/xeno/正确克隆JavaScript数组的方法
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;
}
var x = {}; x.y = x;
每次调用 deepCopy
都会触发 else
语句,并且 JSON 不能处理自引用,因为它本质上是基于树形结构的。 - Jeffr.prototype = obj.prototype;
这段代码的作用是什么?在我看来似乎非常错误。 - Bergiprototype
的属性。这并没有像__proto__
那样设置继承。正确的方法是:Object.create(Object.getPrototypeOf(obj));
,就像@Danny的答案中所示。 - Bergiprototype
部分)。我希望能更好地理解原型和构造函数,以便更深入地了解,但感谢您正确地复制了原型的方式。 - Ian由于您要求性能,我猜您可能会选择非通用解决方案。要复制已知层数的多维数组,应该使用最简单的解决方案,一些嵌套的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);
slice
方法比自定义的for循环更高效,但它不会创建深层副本,因此我们只能在最低级别使用它。var arr1 = [[1,2],[3,4],[5,6]];
var arr2 = structuredClone(arr1); //copy arr1
arr2.push([7,8]);
console.log(arr1); //[[1,2],[3,4],[5,6]]
console.log(arr2); //[[1,2],[3,4],[5,6],[7,8]]
.slice()
构建一个新数组。这将非常快速。 - I Hate Lazymatrix.map((row) => [...row]);
- Nicolás Fantone