【问题标题】:How to empty an JS Object?如何清空 JS 对象?
【发布时间】:2017-01-12 10:42:36
【问题描述】:

我有一个类似的对象

var person = {'id':null, 'name':'John Doe'}

将对象值插入数据库后,我会从服务器获取另一个对象:

var personInDB = {'id':1234, 'name':'John Doe'}

我使用angular.mergeperson 的值更新为personInDB 的值。

但是,我想在应用angular.merge 之前清空person 对象,这样我只能获取数据库中的值。我不想将新的空对象分配给 person,因为这会破坏 Angular 中的数据绑定。

【问题讨论】:

  • 那你为什么不尝试使用$resource呢?

标签: javascript angularjs javascript-objects


【解决方案1】:

我想清空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() 只会用新值覆盖旧值,而无需先清空对象。 (您是否试图允许旧版本的对象可能具有新版本中不再存在的属性的情况(未显示)?)

【讨论】:

  • 我希望我的对象与数据库的对象同步,所以如果数据库代码有问题并且它没有插入name,我想设置我的本地对象的name 属性已删除。
  • 好的,那么我显示的代码应该可以按照您的要求进行清空,并且我已经更新了答案以涵盖旧版浏览器。
【解决方案2】:

如果您只想清空“id”

person['id']=null;

如果你想清空person对象的所有属性,那么

Object.keys(person).forEach(key => person[key]=null);

【讨论】:

    【解决方案3】:

    如果我理解正确,您似乎认为在合并新对象之前需要清空原始对象,否则数据库中的属性将不会被使用。我不认为是这样。我查看了sourceangular.merge,它似乎将每个属性从源对象复制(即:覆盖)到目标对象。所以你根本不需要清空它,只需进行合并,数据库对象上的所有值都会被使用。

    【讨论】:

      【解决方案4】:

      为了避免破坏 angularjs 的数据绑定,我现在手动更新每个字段:

      var person = {id : null, name: 'toto'};
      
      // Ajax call
      person.id = ajaxres.id;
      person.name = ajaxres.name
      

      【讨论】:

        【解决方案5】:

        如果你使用的是ECAM6,那么你可以使用Destructuring_assignment

        [person] = [personInDB ] //Object {id: 1234, name: "John Doe"}
        

        你可以有这样的。

        var arrKeys = Object.keys(person);
        
          arrKeys.forEach(function(val,key){  
        
              person[val] =   personInDB[val];
        
            })
        

        【讨论】:

        • 当我尝试您的[person] = [personInDB ] 代码时,它的结果与person = personInDB 相同,但它没有更新person 确实 引用的现有对象(其中是 OP 所要求的)。
        • @nnnnnn 你能告诉我你是如何测试它的吗?它会增加一些
        • jsfiddle.net/x457wb4x - 结果似乎与您链接到的 MDN 页面所说的一致,因为它就像[a,b] = [c,d] 的更简化版本...
        猜你喜欢
        • 2010-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-16
        • 2017-12-05
        • 2016-04-15
        • 2016-05-12
        • 2011-12-09
        相关资源
        最近更新 更多