对象的深度克隆数组

Deep clone array of objects

本文关键字:数组 深度 对象      更新时间:2023-09-26

我有一个维护内部对象数组的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(或其他库的类似方法)单独克隆对象 - 有没有更简单/本机的替代方案?

深层拷贝的简单实现是

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>