【问题标题】:Removing an object from a javascript list of objects从对象的 javascript 列表中删除对象
【发布时间】:2014-08-06 23:44:48
【问题描述】:

我目前在 javascript 中有一个由键索引的对象列表:

var list = [];
list['a'] = [];
list['a'].push({obj: 'test'});
list['a'].push({obj: 'test2'});

list['b'] = [];
list['b'].push({obj: 'test'});
list['b'].push({obj: 'test2'});

我会根据键 (a/b) 列出删除条目

我尝试了以下方法:

for(var x in list) { delete list[x]; }

这可行,但它实际上在列表中留下了一个未定义的条目。

我也尝试过拼接数组,但在这种情况下似乎不起作用。

关于如何删除 javascript 或 jQuery 中的条目有什么想法吗?

谢谢。

解决方法:

在阅读了一些 cmets 之后,我能够更好地理解我的列表是一致的。因此,我可以通过以下操作进行删除:

delete list.b;

我不确定我的列表是否是组织结构的最佳方式,但是对列表进行删除并将其视为对象属性就可以了。

感谢所有反馈。

【问题讨论】:

  • 你确定你的list 是一个对象而不是一个数组吗?
  • 你是对的,它是一个对象数组。
  • 那么你在问题中的数组定义被破坏了。
  • @Dani 你是要重置 a 还是 b,还是要从 a 或 b 中删除一个元素?
  • 这里的信息太糟糕了,以至于混乱不堪。最新的代码根本不是一个数组,无论您最初是否将它定义为一个数组。 list['a'] 使它成为一个对象,因为 javascript 没有关联数组

标签: javascript jquery arrays object


【解决方案1】:

我假设list 是一个对象,而不是一个数组。

如果您想重置a 或(或b,方法相同)

list.a.length = 0;

如果你想从a 中删除一个已知索引处的元素(让index

list.a.splice(index, 1);

【讨论】:

    【解决方案2】:

    您正在尝试将元素作为对象属性而不是数组元素添加到数组对象。您可以通过检查 list.length 的值(将为 0)来验证这一点。

    所以当做如下事情时:

    function removeProperty(id) {
        if (list.hasOwnProperty(id)) {
          delete list[id];
      }
    }
    
    removeProperty('a');
    

    其实是一样的:

    delete list.a;
    

    这就是为什么你认为它在“列表”中留下了一个未定义的“条目”

    您需要使用文字对象:

    var list = {};
    
    list['a'] = [];
    ...
    
    list['b' = [];
    ...
    

    这将允许您使用delete 并使其行为符合您的预期。当然,您会丢失数组上的 .length 属性,但无论如何您从未拥有过。

    【讨论】:

      【解决方案3】:
      var list = {1: [{},{}], 2: [{},{}]};
      
      function removeProperty(obj, prop){
          if(obj[prop]){
              delete obj[prop];
          }
      }
      
      removeProperty(list,"1");
      
      console.log(list);
      

      【讨论】:

      • 呃,为什么这里需要循环? if (x in obj) { delete ... }
      • 是的 :-) 但问题是 OP 有一个数组 :-)
      • OP 的列表无效。如果将其制成 var list = {1: [{},{}], 2: [{},{}] } 之类的对象,则 delete 应该可以工作。
      • @RajkumarMadhuram OP 编辑​​了他的问题吗?我从问题中复制了该列表变量。
      • 是的,他们做到了,但没有成功)
      【解决方案4】:

      如果这句话:

      我会根据键 (a/b) 列出删除条目

      表示您想根据键(a/b)选择要考虑的列表,然后删除列表中的元素(或全部),您可以试试这个:

      var list = [];
      list['a'] = [];
      list['a'].push({obj: 'test4'});
      list['a'].push({obj: 'test5'});
      
      list['b'] = [];
      list['b'].push({obj: 'test'});
      list['b'].push({obj: 'test2'});
      
      var toRemove = 'test4';
      var removeFrom = "a";
      
      var consideredList;
      for (var prop in list) {
        if (prop == removeFrom) {
          consideredList = list[prop];
        }
      }
      
      //Remove everything from the considered list
      consideredList.splice(0, consideredList.length);
      
      //Remove based off value, if you know the property  name
      // for(var pos in consideredList) {
      //   if(consideredList[pos].obj == toRemove) {
      //     consideredList.splice(pos, 1);
      //   }
      // }
      

      我制作了几个不同案例的Plunker(检查 script.js 文件)。你所追求的似乎有点混乱,希望这对你有所帮助。祝你好运。

      【讨论】:

        猜你喜欢
        • 2021-08-03
        • 2021-04-12
        • 2020-05-27
        • 1970-01-01
        • 2012-04-03
        • 2018-07-08
        • 2019-01-25
        • 2020-06-04
        相关资源
        最近更新 更多