我有像
这样的对象var person = {'id':null, 'name':'John Doe'}
将对象值插入数据库后,我将从服务器获取另一个对象:
var personInDB = {'id':1234, 'name':'John Doe'}
我使用angular.merge
将person
的值更新为personInDB
的值。
但是,我想在应用person
之前清空angular.merge
对象,以便我只获取数据库中的值。我不想将新的空对象分配给person,因为这将破坏angular中的数据绑定。
答案 0 :(得分:3)
我想清空
person
个对象...我不想将新的空对象分配给person
我不知道任何类型的内置对象.deleteAllProperties()
方法,因此循环遍历属性并在每个属性上单独调用delete
。以下是一种相当整洁的方法:
Object.keys(person).forEach(k => delete person[k])
或稍长的非ES6箭头功能版本支持回到IE9:
Object.keys(person).forEach(function(k) { delete person[k]})
对于更老的IE,只需使用for..in
循环(.hasOwnProperty()
检查)。
显然,您可以将上述任何内容放入一个易于重复使用的功能中:
function emptyObject(obj) {
Object.keys(obj).forEach(k => delete obj[k])
}
emptyObject(person)
请注意,尽管这回答了您所问的问题,但我不确定您认为自己为什么需要这样做。您在问题中显示的示例在之前和之后具有相同的两个属性,因此angular.merge()
将使用新值覆盖旧值,而无需先清空对象。 (您是否尝试允许旧版本的对象可能具有新版本中不再存在的属性的案例(未显示)?)
答案 1 :(得分:2)
如果你想要清空' id'仅
person['id']=null;
如果要清空人物对象的所有属性,则
Object.keys(person).forEach(key => person[key]=null);
答案 2 :(得分:1)
如果我理解正确,您似乎认为在合并新的对象之前需要清空原始对象,否则将无法使用数据库中的属性。但我并不认为这是事实。我查看angular.merge
的{{3}},它似乎将源对象中的每个属性复制(即:覆盖)到目标对象。所以你根本不需要清空它,只需进行合并,就可以使用数据库对象上的所有值。
答案 3 :(得分:0)
好吧,为了避免破坏angularjs的数据绑定,我现在手动更新每个字段:
var person = {id : null, name: 'toto'};
// Ajax call
person.id = ajaxres.id;
person.name = ajaxres.name
答案 4 :(得分:0)
如果您使用的是ECAM6,则可以使用Destructuring_assignment
[person] = [personInDB ] //Object {id: 1234, name: "John Doe"}
OR
你可以这样。
var arrKeys = Object.keys(person);
arrKeys.forEach(function(val,key){
person[val] = personInDB[val];
})