如何在JavaScript中克隆一个数组,而不使用JSON.stringify或JSON.parse?
如何在JavaScript中克隆一个数组,而不使用JSON.stringify或JSON.parse?
This question already has answers here:
我有一个数组示例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
内部对象的替代方法。
admin 更改状态以发布 2023年5月21日
使用slice
:var fruits2 = fruits.slice();
可以实现目的。
你的jsFiddle已被修改。
另请参阅:MDN
**编辑。我有点懒,让我们纠正一下我的答案。
对于只包含值的Array
,slice
非常完美。对于包含对象或数组或值/对象/数组混合的Array
,需要克隆Array
和Object
元素。否则它们将是对原始数组或对象的引用(因此:不是副本),对其中一个引用的数组或对象进行更改将在所有包含对它的引用的“克隆”中反映出来。
要克隆一个由数组/对象/混合值组成的Array
,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);
上面链接的 jsFiddle 修改过以演示这些方法。
有关 Array.map
,请再次查看 MDN