Javascript如何正确克隆而不是修改对象

时间:2016-04-19 11:07:28

标签: javascript javascript-objects lodash

我有一个对象,我搜索密钥并在找到密钥匹配时修改值:

var myData = // some http.get which returns a JSON object.

想象一下myData是:

myData : {
    "suffix" : "mr",
    "fname" : "jullian",
    "lname" : "exor",
    "dobGmt" : 145754294700000
    "addressLine1" : "xxx",
    "street" : "xxx",
    "rentStartedGmt" : 145754294700000,
    "deposit" : "50.00",
    "occupation" : "math teacher",
    "profession" : {
         "careerStartedGmt": 1458755224800000,
         "careerEndGmt": 1459854224800000,
     }
}

$scope.viewData = function() {
    var objClone = _.clone(myData);
    objClone = myFactory.ProcessData(objClone);
    $scope.view = objClone;
};

$scope.viewProducts = function() {

};

MyFactory:

myModule.factory('myFactory', function() {
    return {
        ProcessData: function(data) {
            var tmp = data;

            function findGmt(tmp) {
                for (var key in tmp) {
                    var v = tmp[key];
                        if (key.indexOf("Gmt") !== -1) {
                            tmp[key] = tmp[key].format('DD-MM-YY HH:mm');    
                        }    
                    }
                }

            findGmt(tmp);

            return tmp;
        }
    }
});

用户可以点击调用viewData的{​​{1}}按钮,该按钮在同一页面上以模式显示格式化的JSON。 然后,用户点击$scope.viewData,其中viewProducts会在同一页面上显示模式中的产品列表。

但是,点击$scope.viewProducts后,如果我再次点击viewProducts 再次点击,则在调试时,我可以看到var viewData已经格式化了,而不是而不是采用_.clone(myData);

的新克隆

错过了如何克隆/不修改原始对象?

2 个答案:

答案 0 :(得分:2)

通常,clone functions(现在可以由标准Object.assign替换)仅将提供的对象属性复制到新对象中。它们不会递归克隆对象的值。这意味着您的profession属性的内容(例如)与克隆的原始对象和原始属性相同:myData.profession === objClone.profession为真。

您正在寻找的是deep clone功能。

答案 1 :(得分:1)

您必须使用testclass.h。它将创建myObj的副本,但更改myObj不会更改复制的任何内容。