使用lodash在JSON数组中使用多个键过滤多个值 [英] Filtering multiple value with multiple key in json array using lodash

查看:323
本文介绍了使用lodash在JSON数组中使用多个键过滤多个值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

每次可能有动态不同的键值对要过滤在不同数据中时,我都有一个动态数据.我们如何用lodash中的多个键值对它进行过滤.我正在使用其过滤器功能,但结果无法实现.

示例数据:

    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"]}

来自lodash的过滤器功能:

var filtered_data = _.filter(data, filterby);

解决方案

您可以使用纯Javascript并迭代filterBy的键和值.

 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; } 

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

解决方案

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; }

这篇关于使用lodash在JSON数组中使用多个键过滤多个值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆