2010-11-16 164 views
4

我有對象的數組,像這樣:過濾器的JavaScript對象數組

var companies = [ 
    { "name" : "Company 1", 
     "logo" : "/logo.gif" }, 
    { "name" : "Company 2", 
     "logo" : "/logo2.gif" }, 
    { "name" : "Company 3", 
     "logo" : "/logo3.gif" } ]; 

我要過濾這個數組只得到具有存在於另一個數組名稱值:

var myCompanies = [ "Company 1", "Company 3" ]; 

在這個例子中,要返回的數據將是:

var companies = [ 
    { "name" : "Company 1", 
     "logo" : "/logo.gif" }, 
    { "name" : "Company 3", 
     "logo" : "/logo3.gif" } ]; 

什麼是做到這一點的最好方法是什麼?

回答

7

您可以使用$.grep()得到一個新的,過濾陣列,這樣

var result = $.grep(companies, function(e) { 
       return $.inArray(e.name, myCompanies) != -1; 
      }); 

You can test it here。請注意,這個執行比$.each()循環好得多,你可以在這裏進行測試:http://jsperf.com/each-vs-grep

+0

對於jQuery.grep()我有點想念:) – Anpher 2010-11-16 11:15:00

+0

感謝jsperf鏈接 - 我以前沒有聽說過它,這是一個非常好的工具。我在http://jsperf.com/each-vs-grep/4的$ .map()測試用例中添加了這個(顯然這是三個答案中最慢的一個) – Dexter 2010-11-16 11:51:33

1

通過僅環..

var newArray = []; 
$.each(companies, function(){ 
    if($.inArray(this.name, myCompanies) !== -1) newArray.push(this); 
}); 

jQuery的utilies用在這裏:jQuery.each()jQuery.inArray()

+1

你可以這樣做,但要注意它的昂貴得多(由於額外''這個''範圍創建),你可以將它與'$ .grep()'在這裏進行比較:http://jsperf.com/each-vs-grep – 2010-11-16 11:13:16

0

這應該給作業:

companies = $.map(companies,function(element){ 
    return ($.inArray(element.name,myCompanies)>-1?element:null) 
}