2012-11-27 80 views
63

我有一个对象数组,我想知道最好的方式来搜索它。鉴于以下示例,我如何搜索name = "Joe"age < 30?有没有什么jQuery可以帮助或我必须暴力强制搜索自己?javascript过滤器对象数组

var names = new Array(); 

var object = { name : "Joe", age:20, email: "[email protected]"}; 
names.push(object); 

object = { name : "Mike", age:50, email: "[email protected]"}; 
names.push(object); 

object = { name : "Joe", age:45, email: "[email protected]"}; 
names.push(object); 
+0

通过搜索你的意思是过滤器? – joragupra

回答

64

您可以用[].filter方法做到这一点很容易:

var filterednames = names.filter(function(obj) { 
    return (obj.name === "Joe") && (obj.age < 30); 
}); 

您需要加不支持[].filter方法的浏览器的垫片:this MDN page给出了这样的代码。

+0

我建议看看链接的MDN页面中的polyfill,只是为了有一些有趣的阅读代码和学习新的东西,可能。 – Nobita

0

这么快问题。如果你有两个对象数组,并且你想'对齐'这些对象数组,那么你可以确保每个数组的对象与其他数组的顺序相同?如果你不知道数组内的任何对象包含哪些键和值,那么该怎么办......更不用说他们甚至在什么顺序?

因此,您需要为您的[].filter,[].map等设置“通配符表达式”。如何获得通配符表达式?

var jux = (function(){ 
    'use strict'; 

    function wildExp(obj){ 
     var keysCrude = Object.keys(obj), 
      keysA = ('a["' + keysCrude.join('"], a["') + '"]').split(', '), 
      keysB = ('b["' + keysCrude.join('"], b["') + '"]').split(', '), 
      keys = [].concat(keysA, keysB) 
       .sort(function(a, b){ return a.substring(1, a.length) > b.substring(1, b.length); }); 
     var exp = keys.join('').split(']b').join('] > b').split(']a').join('] || a'); 
     return exp; 
    } 

    return { 
     sort: wildExp 
    }; 

})(); 

var sortKeys = { 
    k: 'v', 
    key: 'val', 
    n: 'p', 
    name: 'param' 
}; 
var objArray = [ 
    { 
     k: 'z', 
     key: 'g', 
     n: 'a', 
     name: 'b' 
    }, 
    { 
     k: 'y', 
     key: 'h', 
     n: 'b', 
     name: 't' 
    }, 
    { 
     k: 'x', 
     key: 'o', 
     n: 'a', 
     name: 'c' 
    } 
]; 
var exp = jux.sort(sortKeys); 

console.log('@juxSort Expression:', exp); 
console.log('@juxSort:', objArray.sort(function(a, b){ 
    return eval(exp); 
})); 

您也可以使用此功能在一个重复中的每个对象创建的所有在每个对象的按键更好的集体表达,然后筛选阵列的方式。

这是一个来自API Juxtapose的小片段,我几乎已经完成了,它是这样做的,它与豁免,对象单元和数组凝结对象相等。如果这些是您的项目需要或想要的东西,请发表评论,我会尽早让lib访问。

希望这会有所帮助!快乐编码:)

6

您可以利用jQuery.filter()函数从匹配元素的子集中返回元素。

var names = [ 
 
    { name : "Joe", age:20, email: "[email protected]"}, 
 
    { name : "Mike", age:50, email: "[email protected]"}, 
 
    { name : "Joe", age:45, email: "[email protected]"} 
 
    ]; 
 
    
 
    
 
var filteredNames = $(names).filter(function(idx) { 
 
    return names[idx].name === "Joe" && names[idx].age < 30; 
 
}); 
 

 
$(filteredNames).each(function(){ 
 
    $('#output').append(this.name); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<div id="output"/>

1

var nameList = [ 
 
{name:'x', age:20, email:'[email protected]'}, 
 
{name:'y', age:60, email:'[email protected]'}, 
 
{name:'Joe', age:22, email:'[email protected]'}, 
 
{name:'Abc', age:40, email:'[email protected]'} 
 
]; 
 

 
var filteredValue = nameList.filter(function (item) { 
 
     return item.name == "Joe" && item.age < 30; 
 
}); 
 

 
//To See Output Result as Array 
 
alert(JSON.stringify(filteredValue));

你可以简单地使用JavaScript :)