javascript - 在 JS 对象中搜索值

标签 javascript loops javascript-objects

假设我有一个对象:

userInfo

我想搜索 userInfo 的每个节点,看看键 'username' 的值是否等于 foo。

userInfo[x].username == "foo" 

是否有更好的方法来执行以下操作?

var matchFound = false;

for (var i = 0, len = userInfo.length; i < len; i++)
     matchFound = userInfo[i].username == "foo";

最佳答案

如果不引入另一种数据结构,确实没有更好(更有效)的方法。答案实际上取决于您的使用情况,但您可以做一些不同的事情:

  1. 使用哈希创建单独的“索引”。这些结构会将键映射到源数组中的项目或索引。 JavaScript 对象/哈希支持基于键的查找并且应该是高效的。

    userinfo[x].username = "foo";
    // Index the objects
    usersByName = {};
    usersByName["foo"] = userinfo[x];
    // -- OR -- index the array indices
    var usersByName["foo"] = x;
    // Test for key
    "foo" in usersByName; // true
    

    您将不得不多做一些工作来保持索引和源数组之间的一致性。最好将两者都包装在另一个对象中以管理两者的内容。如果您希望根据多个字段查找对象,则此方法非常有用。

  2. 如果您不关心集合的顺序,您可以将整个事物更改为散列并按用户名进行索引

    var userinfo = {};
    userinfo["foo"] = {username: "foo", firstName: "Foo", lastName: "Bar"};
    

不过,需要考虑的一件事是,效率提升是否会超过维护索引所增加的代码复杂性。如果您没有进行大量搜索,并且 userinfo 集合中没有大量项目,那么编写通用搜索功能或使用像 Philip Schweiger 提到的库可能更有意义。

function findObjectByAttribute (items, attribute, value) {
  for (var i = 0; i < items.length; i++) {
    if (items[i][attribute] === value) {
      return items[i];
    }
  }
  return null;
}
var userinfo = [];
userinfo[0] = {username: "foo"};
console.log(findObjectByAttribute(userinfo, "username", "foo"));

关于javascript - 在 JS 对象中搜索值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7569718/

相关文章:

javascript - 如何在 Javascript/Node 中的异步函数上调用 Await 后超时

javascript - 使用 ReactJS 从数组创建 li 标签

jquery - 帮我改变这个 JS/Jquery 函数来动态创建 Divs

jquery - 重置并循环jquery动画

javascript - 如何在 JavaScript 中使用对象的字符串参数?

javascript - jQuery Sortable 不能拖放

java - 循环不递增

python - 如何读取API JSON数据并存储为Python字典

Javascript 字符串比较

Javascript 子类化、 super 构造函数和使用自定义扩展会丢失基类方法