【问题标题】:Search inside array of objects在对象数组中搜索
【发布时间】:2014-01-06 11:20:05
【问题描述】:

我有一个数组,格式如下:

var clients = [{
    "id": 1, 
    "hash": 5c5fbbb047984ca8eec6dc7a3d994c09, 
    "more": {...}
  }, 
  {
    "id": 2,
    "hash": 620628ce37817a94476d55e55a543bee,
    "more": {...}
  }, 
  {...}, 
  {...}];

它包含大约 25 个对象,但这可能会发生变化。我的程序得到一个 ID,它是一个整数,它必须在 clients 数组中查找,并找到具有指定 ID 的对象,然后从数组中删除该对象。

鉴于可能存在相对大量的对象,最好、最有效的方法是什么?

【问题讨论】:

    标签: javascript arrays node.js


    【解决方案1】:

    你可以像这样使用Array.prototype.filter函数

    var clients = [{"id": 1, "hash": "5c5fbbb047984ca8eec6dc7a3d994c09"},
                   {"id": 2, "hash": "620628ce37817a94476d55e55a543bee"}];
    var idToRemove = 1;
    
    clients = clients.filter(function(currentObject) {
        return currentObject.id !== idToRemove;
    });
    
    console.log(clients);
    

    输出

    [ { id: 2, hash: '620628ce37817a94476d55e55a543bee' } ]
    

    【讨论】:

    • 有什么理由使用括号表示法而不是点表示法?
    【解决方案2】:

    您可以遍历数组并删除具有给定id 的条目。

    function removeClient(clients, id) {
      for(var i = 0; i < clients.length; i++) {
        if(clients[i].id === id) {
          clients.splice(i, 1);
          return;
        }
      }
    }
    

    您也可以为此使用Array.prototype.filter 函数,但我更喜欢这种迭代解决方案,原因有两个:

    • 一旦找到并删除客户端,它就会退出,而不是总是遍历整个数组。
    • 它适用于 IE8 及更低版本,而 Array.prototype.filter 是 IE 直到 IE9 才支持的 ECMAScript 5 功能。

    【讨论】:

    • ES5 方法直到 9 点才进入 IE。;-)
    • @cookiemonster 感谢您指出这一点,我已经更正了帖子。
    • +1 因为您实际上是从数组中删除项目而不是用新数组覆盖。这可能会有所作为。
    • node.js 标签。我相信几乎所有最新版本都支持filter :)
    • @thefourtheye 好点。出于这个原因,我更喜欢为 node.js 开发而不是为浏览器开发。
    猜你喜欢
    • 2017-05-21
    • 2011-04-07
    • 2015-09-12
    • 2013-09-03
    • 1970-01-01
    • 1970-01-01
    • 2021-01-20
    相关资源
    最近更新 更多