如何在JavaScript中克隆一个数组,而不使用JSON.stringify或JSON.parse?

23 浏览
0 Comments

如何在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);

http://jsfiddle.net/vkdqur82/


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

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

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

admin 更改状态以发布 2023年5月21日
0
0 Comments

slice 可以完成这个操作。

你也可以使用 .map 但是通常 .slice 更快。

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

希望能帮到你。

0
0 Comments

使用slicevar fruits2 = fruits.slice();可以实现目的。

你的jsFiddle已被修改。

另请参阅:MDN

**编辑。我有点懒,让我们纠正一下我的答案。

对于只包含值的Arrayslice非常完美。对于包含对象或数组或值/对象/数组混合的Array,需要克隆ArrayObject元素。否则它们将是对原始数组或对象的引用(因此:不是副本),对其中一个引用的数组或对象进行更改将在所有包含对它的引用的“克隆”中反映出来。

要克隆一个由数组/对象/混合值组成的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

0