Filtering multiple value with multiple key in json array using lodash
14,596
Solution 1
You could use plain Javascript and iterate the keys of the filterBy and the values.
var data = [{ VOTER: 1012, PARTY: "REPUBLICAN", PRECINCT: 2408, AGE_GROUP: "71 +", LAST_VOTED: "08/2006", YEARS_REG: 51, BALLOT_STATUS: "PERM" }, { VOTER: 1013, PARTY: "REPUBLICAN", PRECINCT: 2411, AGE_GROUP: "71 +", LAST_VOTED: "08/2006", YEARS_REG: 50, BALLOT_STATUS: "PERM" }, { VOTER: 1014, PARTY: "DEMOCRAT", PRECINCT: 2424, AGE_GROUP: "71 +", LAST_VOTED: "08/2006", YEARS_REG: 50, BALLOT_STATUS: "PERM" }, { VOTER: 1015, PARTY: "DEMOCRAT", PRECINCT: 2418, AGE_GROUP: "71 +", LAST_VOTED: "08/2006", YEARS_REG: 50, BALLOT_STATUS: "POLL" }, { VOTER: 1109, PARTY: "AMERICAN INDEP", PRECINCT: 2404, AGE_GROUP: "71 +", LAST_VOTED: "08/2006", YEARS_REG: 34, BALLOT_STATUS: "POLL" }, { VOTER: 1111, PARTY: "DECLINED", PRECINCT: 2414, AGE_GROUP: "71 +", LAST_VOTED: "08/2006", YEARS_REG: 34, BALLOT_STATUS: "POLL" }],
filterBy = { PARTY: ["REPUBLICAN", "DEMOCRAT"], BALLOT_STATUS: ["PERM", "POLL"] },
result = data.filter(function (o) {
return Object.keys(filterBy).every(function (k) {
return filterBy[k].some(function (f) {
return o[k] === f;
});
});
});
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
ES6
var data = [{ VOTER: 1012, PARTY: "REPUBLICAN", PRECINCT: 2408, AGE_GROUP: "71 +", LAST_VOTED: "08/2006", YEARS_REG: 51, BALLOT_STATUS: "PERM" }, { VOTER: 1013, PARTY: "REPUBLICAN", PRECINCT: 2411, AGE_GROUP: "71 +", LAST_VOTED: "08/2006", YEARS_REG: 50, BALLOT_STATUS: "PERM" }, { VOTER: 1014, PARTY: "DEMOCRAT", PRECINCT: 2424, AGE_GROUP: "71 +", LAST_VOTED: "08/2006", YEARS_REG: 50, BALLOT_STATUS: "PERM" }, { VOTER: 1015, PARTY: "DEMOCRAT", PRECINCT: 2418, AGE_GROUP: "71 +", LAST_VOTED: "08/2006", YEARS_REG: 50, BALLOT_STATUS: "POLL" }, { VOTER: 1109, PARTY: "AMERICAN INDEP", PRECINCT: 2404, AGE_GROUP: "71 +", LAST_VOTED: "08/2006", YEARS_REG: 34, BALLOT_STATUS: "POLL" }, { VOTER: 1111, PARTY: "DECLINED", PRECINCT: 2414, AGE_GROUP: "71 +", LAST_VOTED: "08/2006", YEARS_REG: 34, BALLOT_STATUS: "POLL" }],
filterBy = { PARTY: ["REPUBLICAN", "DEMOCRAT"], BALLOT_STATUS: ["PERM", "POLL"] },
result = data.filter(o => Object.keys(filterBy).every(k => filterBy[k].some(f => o[k] === f)));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Solution 2
_.filter
method doesn't allow you to specify multiple options for filtering. Try with passing custom filter function:
_.filter(data, function (item) {
return ['REPUBLICAN', 'DEMOCRAT'].indexOf(item.PARTY) >= 0
&& ['PERM', 'POLL'].indexOf(item.BALLOT_STATUS) >= 0
})
Author by
Mayur
Updated on June 28, 2022Comments
-
Mayur almost 2 years
i have a dynamic data each time there could be dynamically different key value pair to be filtered in different data. how can we filter it with multiple key,value in lodash. i was using its filter function but result is not achievable.
example data:
var data = [ { "VOTER" : 1012, "PARTY" : "REPUBLICAN", "PRECINCT" : 2408, "AGE_GROUP" : "71 +", "LAST_VOTED" : "08/2006", "YEARS_REG" : 51, "BALLOT_STATUS" : "PERM" }, { "VOTER" : 1013, "PARTY" : "REPUBLICAN", "PRECINCT" : 2411, "AGE_GROUP" : "71 +", "LAST_VOTED" : "08/2006", "YEARS_REG" : 50, "BALLOT_STATUS" : "PERM" }, { "VOTER" : 1014, "PARTY" : "DEMOCRAT", "PRECINCT" : 2424, "AGE_GROUP" : "71 +", "LAST_VOTED" : "08/2006", "YEARS_REG" : 50, "BALLOT_STATUS" : "PERM" }, { "VOTER" : 1015, "PARTY" : "DEMOCRAT", "PRECINCT" : 2418, "AGE_GROUP" : "71 +", "LAST_VOTED" : "08/2006", "YEARS_REG" : 50, "BALLOT_STATUS" : "POLL" },{ "VOTER" : 1109, "PARTY" : "AMERICAN INDEP", "PRECINCT" : 2404, "AGE_GROUP" : "71 +", "LAST_VOTED" : "08/2006", "YEARS_REG" : 34, "BALLOT_STATUS" : "POLL" },{ "VOTER" : 1111, "PARTY" : "DECLINED", "PRECINCT" : 2414, "AGE_GROUP" : "71 +", "LAST_VOTED" : "08/2006", "YEARS_REG" : 34, "BALLOT_STATUS" : "POLL" } ]
and filter object is:
var filterby = {"PARTY":["REPUBLICAN","DEMOCRAT"],"BALLOT_STATUS":["PERM","POLL"]}
Filter function from lodash:
var filtered_data = _.filter(data, filterby);