我有一个数组示例fruit
。我想将其复制为数组fruits2
,而不保留参考。
如下例所示,保留了引用,以便修改fruits
。
var fruit = function (name){
this.name = name;
}
var fruits = [];
fruits.push(new fruit('apple'));
fruits.push(new fruit('banana'));
fruits.push(new fruit('orange'));
var fruits2 = fruits;
fruits2.length = 0;
console.log(fruits);
使用JSON.stringify和JSON.parse可以解决问题,但fruits2
中的对象不再是fruit
类型的对象,而是一般类型object
var temp = JSON.stringify(fruits);
var fruits2 = JSON.parse(temp);
我想知道一种可以保留fruit
内部对象的替代方法。
答案 0 :(得分:9)
使用slice
:var fruits2 = fruits.slice();
应该这样做。
您的jsFiddle,已修改
另请参阅:MDN
<强> **修改。我有点懒,让我更正我的答案以弥补这一点。
对于Array
只值slice
是完美的。对于Array
个对象或数组或值/对象/数组的混合,要克隆的Array
的{{1}}和Object
元素也需要克隆。否则它们将引用原始数组或对象(因此:不是副本),并且[这些数组或对象引用]中的一个的更改将反映在包含对它的引用的所有“克隆”中。
如果您的朋友,要克隆Array
数组/对象/混合值Array
。有几种方法可以考虑:
Array.map
var fruits1 = fruits.map(function(v) {return new Fruit(v.name);});
var fruits2 = fruits.map(function(v) {return JSON.parse(JSON.stringify(v));});
在案例3中,克隆方法可能如下所示:
var fruits3 = fruits.map(function(v) {return cloneObj(v);});
使用此function cloneObj(obj) {
function clone(o, curr) {
for (var l in o){
if (o[l] instanceof Object) {
curr[l] = cloneObj(o[l]);
} else {
curr[l] = o[l];
}
}
return curr;
}
return obj instanceof Array
? obj.slice().map( function (v) { return cloneObj(v); } )
: obj instanceof Object
? clone(obj, {})
: obj;
}
方法,cloneObj
已过时
您也可以使用Array.map
修改上述链接中的jsFiddle以演示这些方法。
对于var fruitsx = cloneObj(fruits);
,请再次查看MDN
答案 1 :(得分:2)
slice
可以解决问题。
您也可以使用.map
,但.slice
通常更快。
var copy = fruits.map(function(item) {return item});
希望有所帮助
答案 2 :(得分:0)
您可以声明一个新数组并使用concat方法,以便将数组中的所有值连接到新数组。像这样:
var x = ["a","b"];
var a = [];
a = a.concat(x);
console.log(a);
我编辑了我糟糕的答案。
最好的问候。