参见英文答案 >
Copy array by value 33个
我有一个数组示例水果.我想将它复制为数组fruits2,而不保留引用.
我有一个数组示例水果.我想将它复制为数组fruits2,而不保留引用.
如下面的示例所示,保留了引用以便修改水果.
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中的对象不再是类型的水果,而是一般类型的对象
var temp = JSON.stringify(fruits); var fruits2 = JSON.parse(temp);
我想知道一种可以保持水果内在对象的替代方法.
解决方法
使用slice:var fruits2 = fruits.slice();应该这样做.
另见:MDN
**编辑.我有点懒,让我更正我的答案以弥补这一点.
对于一个只是值的数组切片是完美的.对于对象或数组的数组或值/对象/数组的混合,要克隆的数组的Array和Object元素也需要克隆.否则它们将是对原始数组或对象的引用(因此:不是副本),并且一个[数组或对象的这些引用]的更改将反映在包含对它的引用的所有“克隆”中.
如果您的朋友,要克隆阵列数组/对象/混合值Array.map.有几种方法可以考虑:
>使用旧数据创建新实例
var fruits1 = fruits.map(function(v){return new Fruit(v.name);});
>使用JSON
var fruits2 = fruits.map(function(v){return JSON.parse(JSON.stringify(v));});
>创建并使用一些克隆方法
var fruits3 = fruits.map(function(v){return cloneObj(v);});
在案例3中,克隆方法可能如下所示:
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已过时.
你也可以使用var fruitsx = cloneObj(fruits);
对于Array.map,请再次参见MDN