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

How to clone an array in javascript without using JSON.stringify or JSON.parse?

本文关键字:JSON 情况下 javascript 数组 parse stringify      更新时间:2023-09-26

我有一个数组示例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的内部对象。

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

您的jsFiddle,已修改

另请参阅:MDN

**编辑。我有点懒,让我们纠正我的答案来弥补这一点。

对于一个只有值的CCD_ 10,CCD_。对于对象或数组的Array或值/对象/数组的混合,要克隆的ArrayArrayObject元素也需要克隆。否则,它们将是对原始数组或对象的引用(因此:不是副本),其中一个数组或对象引用的更改将反映在所有包含引用的"克隆"中。

要克隆数组/对象/混合值的ArrayArray.map是您的朋友。有几种方法可以考虑:

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

slice可以做到这一点。

您也可以使用.map,但.slice通常更快。

var copy = fruits.map(function(item) {return item});

希望它能帮助

您可以声明一个新数组并使用concat方法,以便将数组中的所有值连接到新数组中。类似这样的东西:

var x = ["a","b"];
var a = [];
a = a.concat(x);
console.log(a);

我修改了我糟糕的回答。

致以最良好的问候。