【问题标题】:Filtering multiple value with multiple key in json array using lodash使用lodash在json数组中使用多个键过滤多个值
【发布时间】:2017-12-27 10:13:19
【问题描述】:

我有一个动态数据,每次可以动态地在不同的数据中过滤不同的键值对。我们如何使用 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 jquery json filter lodash


    【解决方案1】:

    您可以使用纯 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; }

    【讨论】:

    • 你好,我知道现在问太晚了,但我已经使用你的代码进行过滤,但是出现了一个错误,比如 .some is not a function,你能帮忙解决这个问题吗
    • @RahulDudharejiya,你需要与上面一样的 filterBy 相同的对象结构,属性和数组作为值,因为你需要来自 Array 原型的方法。请添加拍摄对象的示例。
    • @NinaScholz 嗨,为时已晚,但是如果 Json 数组是嵌套的,如何修改它。在这里,我想使用 voter 和 statusVal 进行过滤。例如:[ {“VOTER”:1012,“PARTY”:“REPUBLICAN”,“PRECINCT”:2408,“AGE_GROUP”:“71 +”,“LAST_VOTED”:“08/2006”,“YEARS_REG”:51,“ BALLOT_STATUS" : "PERM" "vehicleStatusHistory": { "id": 721, "Ind": "Y", "status": { "StatusId": 3, "StatusVal": "In-Transit" } }, } ]
    • 这是一种完全不同的格式。请提出一个新问题以及想要的结果和代码,你试过了。
    • 真正值得的解决方案。
    【解决方案2】:

    迭代集合元素的_.filter 函数在您的情况下传递第一个参数是data,第二个参数应该是每次迭代调用的函数,有关详细信息,请参阅Documentation

    在您的示例中,您可以使用 Arrow Functions

    请在下面的 sn-p 中找到更多信息。

    如下更改您的filterby var

    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>

    【讨论】:

      【解决方案3】:

      _.filter 方法不允许您指定多个过滤选项。尝试通过自定义过滤功能:

      _.filter(data, function (item) {
        return ['REPUBLICAN', 'DEMOCRAT'].indexOf(item.PARTY) >= 0
            && ['PERM', 'POLL'].indexOf(item.BALLOT_STATUS) >= 0
      })
      

      【讨论】:

      • 感谢@hsz,感谢您的回答,但 filterby 将是动态的,我不知道可能有 2 个以及 3 个或 5 个键值对,例如可能有: var filterby = {"PARTY": ["REPUBLICAN","DEMOCRAT"],"BALLOT_STATUS":["PERM","POLL"],"VOTER":"1014"}
      • 所以改用变量。
      • 你能指导我吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-19
      • 1970-01-01
      • 1970-01-01
      • 2017-02-16
      相关资源
      最近更新 更多