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
})
Share:
14,596
Mayur
Author by

Mayur

Updated on June 28, 2022

Comments

  • Mayur
    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);