2013-11-10 37 views
3

在給定的searchObject規格中是否有任何簡短而整潔的方式查找以下列表中的項目?javascript中的多個字段比較

var list = [ 
    { id:1, name: "foo", description: "description 1" }, 
    { id:2, name: "bar", description: "description 2" }, 
    { id:3, name: "baz", description: "description 3" }, 
]; 

var searchObject = { id: 2, name: "bar" }; 

searchObject確實一定在列表中的項目的所有屬性。我需要屬性之間的運算符爲(id == 2 & & name ==「bar」)。以下是我所想到的。有什麼本地的JavaScript可以做到這一點?

for (var i in list) { 
    var found = true; 
    for (var p in searchObject) { 
     if (list[i][p] !== searchObject[p]) { 
      found = false; 
      break; 
     } 
    } 
    if(found) return list[i]; 
} 
+0

請不要在數組中使用'for(x in y)'。 [它不會做你的想法](http://stackoverflow.com/a/500531/36866) – some

回答

0

根據我的經驗,如果解決方案存在,它不會比你的更好。

最好不要在數組中使用for...in語句,因爲它枚舉了數組的屬性,而不是元素。考慮以下幾點:

Array.prototype.test = function() { }; 
for (var i in q) console.log(i); 

此代碼將輸出test這可能不是你可能期望。

無論如何,對於這種事情我使用lo-dash。它的_.find(...)方法完全符合你的需求,你可以看看這個方法的源代碼,我認爲這是最有效的實現。

3

不,沒有原生的方式。有些人可能更喜歡以下內容,因爲它的更多javascripty,但它當然不具備原始版本所具有的卓越瀏覽器支持。

var matches = list.filter(function(arrElem){ 
    return Object.keys(searchObject).every(function(prop){ 
     return searchObject[prop] === arrElem[prop]; 
    }); 
}); 

請注意,這將返回一個包含所有匹配項的數組,而不僅僅是像您的第一個匹配項。還請注意,與您的不同,這不會測試searchObject上的繼承的可枚舉屬性,儘管您可能不想搜索繼承的屬性。

ps,許多這些「我希望js有一個更好的方式做x」的願望由underscore.js滿足。特別是,findWhere方法是你所追求的:

var match = _.findWhere(list, searchObject); 
+0

「javascripty」,你的意思是功能? –

+0

@ChristopherHarris有點兒......也許更像是強調javascripts必需的面向對象/功能性思想的獨特混合。 – goat