如何复制JSON对象

时间:2014-03-05 23:10:09

标签: javascript json node.js express

您好我有一个JSON对象

var A = {"Name:""Abd'Allah", "Age":43, "Homeland":"Australia"};

现在我复制到B并添加/删除/修改一些属性

var B = A;
delete B.Homeland;

现在问题是当我从B中删除了值时,它也从A中删除了。为什么?如何复制JSON变量?

目前我正在做的是

var B = JSON.parse(JSON.stringify(A));

但这有点愚蠢。做正确的方法是什么?

2 个答案:

答案 0 :(得分:4)

通常,最好的方法是:

var B = Object.create(A)

之后,无论你想要什么,你都可以用B做,A不会被改变(但反之并非总是如此)。

它不是真正复制对象(它会设置原型链),但请检查它是否适合您。

答案 1 :(得分:2)

在javascript中分配对象或数组不会复制。当你这样做

var B = A;

现在你只需要两个指向同一个对象的变量。如果您修改该对象(通过任一变量),则只有一个对象,因此对该对象的引用都将看到更改。

如果你想在javascript中复制一个对象,只需将所有属性从一个对象复制到另一个对象,就可以制作一个浅层副本:

function shallowCopy(obj) {
    var newObj = {};
    for (var prop in obj) {
        if (obj.hasOwnProperty(prop)) {
            newObj[prop] = obj[prop];
        }
    }
    return newObj;
}

注意,这是一个浅拷贝。如果属性本身包含其他对象,那么这将不会创建那些对象的新副本(它只会复制对它们的引用)。


通过更多的工作,您还可以进行深层复制,它将复制对象中包含的对象。这个函数唯一的问题是你必须确保没有循环引用,其中A包含一个属性,该属性包含一个也包含A的对象或数组,因为如果存在循环参考。

 function deepCopy(obj) {
    if (typeof obj !== "object" || obj === null) {
        return obj;
    }
    var newObj = obj instanceof Array ? [] : {};
    for (var prop in obj) {
        if (obj.hasOwnProperty(prop)) {
            newObj[prop] = deepCopy(obj[prop]);
        }
    }
    return newObj;
 }

此函数不保留非普通对象的对象类型(当然,您的JSON解决方案也不保留)。要做到这一点,需要更多涉及构造函数的工作。