深度克隆对象数组

时间:2014-12-04 21:22:32

标签: javascript jquery

我有一个javascript对象,它维护一个内部对象数组。我有一个返回数组的方法,但我需要防止对数组及其中的对象进行外部操作。

尝试slice复制数组但我注意到内部的对象仍然是引用到原始数据,而数组本身是新的。我以前从未注意到这一点,但我已经证实了这一点:

function test(){

    // I want this to be safe from outside influence
    var a = [{
        val: 1   
    },{
        val: 2   
    }];

    return {
        all: function(){
            return a.slice();
        }
    }
}

var instance = test();
var copy = instance.all();

// This affects both "copy" and the original
copy[0].val = 'wrong';

// This clears "copy" but doesn't affect the original
copy = [];

http://jsfiddle.net/dczz7sL4/1/

我需要一个真正的新副本,以便局外人无法使用我设计的API方法修改数组。我假设所有我可以做的事情迭代数组并使用$.extend(或其他库中的类似方法)单独克隆对象 - 是否有更容易/本机替代?

1 个答案:

答案 0 :(得分:1)

深层复制的简单实现是

function clone(obj) {
    return JSON.parse(JSON.stringify(obj));
}

请注意,如果您的对象中有循环引用,或者您有函数,那么这不会起作用。

您还可以使用jQuery.extend传递true作为深层复制的第一个参数



var a =[{a:1}]
var b = $.extend(true, [], a);
b[0].a = 0;
$('#first').html(JSON.stringify(a));
$('#second').html(JSON.stringify(b));

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

First Array: <span id='first'></span> <br />
Clonde Array: <span id='second'></span>
&#13;
&#13;
&#13;