如何在不使用JSON.stringify或JSON.parse的情况下在javascript中克隆数组?

时间:2014-09-11 19:27:23

标签: javascript jquery

我有一个数组示例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);

http://jsfiddle.net/vkdqur82/


使用JSON.stringify和JSON.parse可以解决问题,但fruits2中的对象不再是fruit类型的对象,而是一般类型object

var temp = JSON.stringify(fruits);
var fruits2 = JSON.parse(temp);

我想知道一种可以保留fruit内部对象的替代方法。

3 个答案:

答案 0 :(得分:9)

使用slicevar fruits2 = fruits.slice();应该这样做。

您的jsFiddle,已修改

另请参阅:MDN

<强> **修改。我有点懒,让我更正我的答案以弥补这一点。

对于Array只值slice是完美的。对于Array个对象或数组或值/对象/数组的混合,要克隆的Array的{​​{1}}和Object元素也需要克隆。否则它们将引用原始数组或对象(因此:不是副本),并且[这些数组或对象引用]中的一个的更改将反映在包含对它的引用的所有“克隆”中。

如果您的朋友,要克隆Array数组/对象/混合值Array。有几种方法可以考虑:

  1. 使用旧数据创建新实例
    Array.map
  2. 使用JSON
    var fruits1 = fruits.map(function(v) {return new Fruit(v.name);});
  3. 创建并使用一些克隆方法
    var fruits2 = fruits.map(function(v) {return JSON.parse(JSON.stringify(v));});
  4. 在案例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);

我编辑了我糟糕的答案。

最好的问候。