在JS对象中搜索值

dor*_*emi 5 javascript loops javascript-objects

说我有一个对象:

userInfo
Run Code Online (Sandbox Code Playgroud)

我想搜索userInfo的每个节点以查看键“ username”是否具有等于foo的值。

userInfo[x].username == "foo" 
Run Code Online (Sandbox Code Playgroud)

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

var matchFound = false;

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

Pet*_*olz 4

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

  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
    
    Run Code Online (Sandbox Code Playgroud)

    您必须投入更多的工作来维护索引和源数组之间的一致性。最好将两者包装在另一个对象中以管理两者的内容。如果您想要通过多个字段查找对象,则此方法非常有用。

  2. 如果您不关心集合的顺序,您可以将整个集合更改为哈希值并按用户名索引

    var userinfo = {};
    userinfo["foo"] = {username: "foo", firstName: "Foo", lastName: "Bar"};
    
    Run Code Online (Sandbox Code Playgroud)

不过,需要考虑的一件事是,效率的提高是否会超过维护索引所增加的代码复杂性。如果您没有进行大量搜索,并且用户信息集合中没有大量项目,那么编写通用搜索函数或使用像 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"));
Run Code Online (Sandbox Code Playgroud)