使用对象javascript搜索对象数组

时间:2014-05-21 07:05:39

标签: javascript loops for-loop foreach

我有一个像这样的数组

var userdata = [
    {"id":1,"gender":"M","first":"John","last":"Smith","city":"Seattle, WA","status":"Active"},
    {"id":2,"gender":"F","first":"Kelly","last":"Ruth","city":"Dallas, TX","status":"Active"},
    {"id":3,"gender":"M","first":"Jeff","last":"Stevenson","city":"Washington, D.C.","status":"Active"},
    {"id":4,"gender":"F","first":"Jennifer","last":"Gill","city":"Seattle, WA","status":"Inactive"}
]

我需要在某些条件下过滤此数组。这些条件的形式是这样的。

var search_object = {gender:"M",city:"Seattle, WA"}
// Gender = M and city =  'Seattle, WA'
var search_object1 = {gender:"M"}
var search_object2 = {city:"Seattle, WA"}
// This is same as above
var search_array = {status:["Active","Inactive"]}
// Status Active or Inactive
var search_array = [{status:"Active"},{status:"Inactive"}]
// Same as above
var search_object1 = {gender:"F"}
var search_array   = [{status:"Active"},{status:"Inactive"}]
//Gender = F and status = Active or Inactive
var search_object = {gender:"F"}
var search_array  = [{status:["Active","Inactive"]}]
// same as above

我尝试过循环但失败了。请帮助或建议或提供一些适当的链接以获得帮助。

2 个答案:

答案 0 :(得分:7)

以下代码涵盖了您提到的所有案例。

function search(searchObj, data) {
    if(searchObj instanceof Array) {
        return data.reduce(function(prev, current, index, array) {
             return prev.concat(search(current, data));
        }, []);
    } else {
        var results = data.filter(function(el) {
             for(var prop in searchObj) {
                if(searchObj[prop] instanceof Array) {
                    if(searchObj[prop].indexOf(el[prop]) == -1) {
                        return false;
                    }
                } else
                if(el[prop] !== searchObj[prop]) {
                    return false;
                }
            }

            return true;
        });

        return results;
    }
};

search(search_object, userdata);

以下是JSFiddle中的工作示例。

以下是我上面使用过的函数的一些链接:

答案 1 :(得分:1)

正如RGraham在评论中所说,你可以在数组上使用过滤函数。

var search_object = {gender:"M",city:"Seattle, WA"};
var filtered = userdata.filter(function(obj){
    return (obj.gender === search_object && obj.city === search_object.city)
});
filtered[0];//Array with objects that return true;