【问题标题】:Javascript how to properly clone and not modify an object [duplicate]Javascript如何正确克隆而不修改对象[重复]
【发布时间】:2016-04-19 11:07:28
【问题描述】:

我有一个对象,如果找到键匹配,我会搜索键并修改值:

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() {

};

我的工厂:

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 按钮,该按钮调用$scope.viewData,在同一页面上以模式显示格式化的JSON。 然后用户点击viewProducts,它调用$scope.viewProducts,在同一页面上以模式显示产品列表。

但是,在点击viewProducts 之后,如果我返回点击viewData 再次,在调试时,我可以看到 var objClone 已经格式化,而不是采用新的克隆_.clone(myData);

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

【问题讨论】:

  • @evolutionxbox 在上下文中重复,当操作要求完全不同的语言时没有帮助。
  • @Val - 我的错 - 删除
  • 我个人会尝试这个链接,stackoverflow.com/questions/122102/…(这是.extend,但不确定参考是否丢失,如你所问)

标签: javascript javascript-objects lodash


【解决方案1】:

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

您正在寻找的是deep clone 函数。

【讨论】:

    【解决方案2】:

    你必须使用var copiedObj = angular.copy(myObj)。它将创建 myObj 的副本,但更改 myObj 不会更改copyObj 中的任何内容。

    【讨论】:

      猜你喜欢
      • 2010-10-18
      相关资源
      最近更新 更多