Javascript 如何正确克隆而不修改对象
Javascript how to properly clone and not modify an object
我有一个对象,我搜索键并在找到键匹配时修改值:
var myData = // some http.get which returns a JSON object.
假设我的数据是:
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);
的新克隆
有没有想过如何clone/not修改原始对象?
你必须使用 var copiedObj = angular.copy(myObj)
。它将创建 myObj 的副本,但更改 myObj 不会更改 copiedObj 中的任何内容。
通常,clone functions (that can now be replaced by the standard Object.assign) 仅将提供的对象属性复制到新对象中。它们不会递归地克隆对象的值。这意味着您的 profession
属性 的内容对于克隆的和原始的是相同的对象:myData.profession === objClone.profession
为真。
您要查找的是 deep clone 函数。
我有一个对象,我搜索键并在找到键匹配时修改值:
var myData = // some http.get which returns a JSON object.
假设我的数据是:
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);
有没有想过如何clone/not修改原始对象?
你必须使用 var copiedObj = angular.copy(myObj)
。它将创建 myObj 的副本,但更改 myObj 不会更改 copiedObj 中的任何内容。
通常,clone functions (that can now be replaced by the standard Object.assign) 仅将提供的对象属性复制到新对象中。它们不会递归地克隆对象的值。这意味着您的 profession
属性 的内容对于克隆的和原始的是相同的对象:myData.profession === objClone.profession
为真。
您要查找的是 deep clone 函数。