问题
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);
回答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; }
回答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
})
回答3:
The _.filter function which iterates over elements of collection which is passes on first parameter in your case it's data and second parameter should be a function which is invoked per iteration for more info see Documentation.
For this in your example you can use Arrow Functions
Please find below snippet for more info.
Change your filterby var as below
var filterby = (m) => { return m => m.PARTY == "REPUBLICAN" || m.PARTY == "DEMOCRAT" && m.BALLOT_STATUS == "PERM" || m.BALLOT_STATUS == "POLL" };
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"
}
]
//var filterby = {"PARTY":["REPUBLICAN","DEMOCRAT"],"BALLOT_STATUS":["PERM","POLL"]}
var filterby = (m) => { return m => m.PARTY == "REPUBLICAN" || m.PARTY == "DEMOCRAT" && m.BALLOT_STATUS == "PERM" || m.BALLOT_STATUS == "POLL" };
var filtered_data = _.filter(data, filterby);
console.log(filtered_data);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/lodash/4.17.4/lodash.min.js"></script>
来源:https://stackoverflow.com/questions/45236312/filtering-multiple-value-with-multiple-key-in-json-array-using-lodash