2012-11-27 163 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 :)