2010-11-16 113 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) 
}