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

参见英文答案 > Copy array by value                                    33个
我有一个数组示例水果.我想将它复制为数组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);

http://jsfiddle.net/vkdqur82/

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

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

我想知道一种可以保持水果内在对象的替代方法.

解决方法

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

你的jsFiddle,修改过

另见: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);

上面链接中的jsFiddle被修改以演示这些方法.

对于Array.map,请再次参见MDN

相关文章

文章浏览阅读2.4k次。最近要优化cesium里的热力图效果,浏览...
文章浏览阅读1.2w次,点赞3次,收藏19次。在 Python中读取 j...
文章浏览阅读1.4k次。首字母缩略词 API 代表应用程序编程接口...
文章浏览阅读802次,点赞10次,收藏10次。解决一个JSON反序列...
文章浏览阅读882次。Unity Json和Xml的序列化和反序列化_uni...