搜索JS对象的值

时间:2011-09-27 13:12:37

标签: 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";

3 个答案:

答案 0 :(得分: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
    

    您需要投入更多工作来维护索引和源数组之间的一致性。最好将两者都包装在另一个对象中来管理两者的内容。如果您想要查看多个字段,这种方法很好。

  2. 如果您不关心集合的顺序,您可以通过用户名将整个内容更改为哈希和索引

    var userinfo = {};
    userinfo["foo"] = {username: "foo", firstName: "Foo", lastName: "Bar"};
    
  3. 但是,要考虑的一件事是,效率增益是否会超过维护索引的代码复杂性增加。如果您没有进行大量搜索,并且在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"));
    

答案 1 :(得分:3)

不需要三元运算符,请考虑以下因素:

var matchFound = false;

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

答案 2 :(得分:1)

下划线JS库有一些方便的方法来处理数据集合 - 例如select method

实现它就像这样:

var userInfo = {
    'x':{
        username: "foo",
        password:'dlji'
    },
    'y':{
        username: "bar" ,
        password:'adfasf'
    },
    'z': {
        username: 'foo',
        password:'d3alj4i'
    }
};

var found = _.select(userInfo, function(node){

    return node.username === "foo"
}); 
console.dir (found);

下划线并不是很大,虽然你也可以在原生JS中做到这一点,但我认为它可以很好地实现你自己提出的解决方案。基本上,它为您提供了许多您认为应该存在的JS功能。