2011-09-27 133 views
3

說我有一個對象:搜索JS對象價值

userInfo 

我要搜索用戶信息的每個節點,以查看是否的關鍵「用戶名」具有等於FOO的值。

userInfo[x].username == "foo" 

有沒有更好的方法來做到以下幾點?

var matchFound = false; 

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

這是行不通的。 matchFound的值經常被覆蓋。 – awm

+1

另外,''是什麼意思? true:false'部分? 'userInfo [i] .username ==「foo」'已經評估爲true或false。 – awm

+1

從技術上說,你可以通過裏面有'Objects'的'Array'循環。沒有太多的方法可以做到這一點。 @awm,我假設他向我們展示了僞代碼。 – c69

回答

3

沒有引入另一個數據結構,沒有更好的方法(效率更高)。答案真的取決於你的使用,但你可以做一些不同的事情:

  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")); 
2

無需三元運算符,考慮以下因素:

var matchFound = false; 

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

沒錯,但我的問題的本質更多的是尋找更有效的搜索對象(如果存在的話)。 – doremi

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功能。