【问题标题】:Filter array of objects by multiple properties and values按多个属性和值过滤对象数组
【发布时间】:2017-11-03 23:37:43
【问题描述】:

是否可以通过多个值过滤对象数组?

例如,在下面的示例中,我可以通过 term_ids 5 和 6 过滤它并同时键入 car 吗?

[  
   {  
      "id":1,
      "term_id":5,
      "type":"car"
   },
   {  
      "id":2,
      "term_id":3,
      "type":"bike"
   },
   {  
      "id":3,
      "term_id":6,
      "type":"car"
   }
]

如果它更容易的话,绝对适合使用库。

【问题讨论】:

    标签: javascript filter


    【解决方案1】:

    你可以用Array.filter做到这一点

    var data = [{
        "id": 1,
        "term_id": 5,
        "type": "car"
      },
      {
        "id": 2,
        "term_id": 3,
        "type": "bike"
      },
      {
        "id": 3,
        "term_id": 6,
        "type": "car"
      }
    ];
    
    var result = data.filter(function(v, i) {
      return ((v["term_id"] == 5 || v["term_id"] == 6) && v.type == "car");
    })
    
    console.log(result)

    【讨论】:

      【解决方案2】:

      您可以使用纯 js 的 filter() 方法执行此操作,并使用 && 测试这两种情况。

      var data = [{"id":1,"term_id":5,"type":"car"},{"id":2,"term_id":3,"type":"bike"},{"id":3,"term_id":6,"type":"car"}];
      
      var result = data.filter(function(e) {
        return [5, 6].includes(e.term_id) && e.type == 'car'
      });
      
      console.log(result);

      【讨论】:

      • 不错!我正在尝试过滤,但不知道可以这样做!谢谢!
      • @Nenad Vracar,非常好!是否可以在不循环对象的情况下替换搜索词?我想突出显示结果。
      【解决方案3】:

      下面的函数会帮助你。

          nestedFilter = (targetArray, filters) => {
                var filterKeys = Object.keys(filters);
                return targetArray.filter(function (eachObj) {
                  return filterKeys.every(function (eachKey) {
                    if (!filters[eachKey].length) {
                      return true; 
                    }
                    return filters[eachKey].includes(eachObj[eachKey]);
                 });
             });
          };
      

      将此功能与如下所述的过滤器一起使用:

      var filters = {
          "id": ["3"],
          "term_id": ["6"],
          "type": ["car","bike"]
      }
      

      不要传递空数组。如果数组中没有值,请跳过过滤器中的该属性。

      结果将被过滤数组。

      【讨论】:

      • 如果我们可以通过小写检查所有输入值来避免区分大小写的匹配呢?会不会像:filters[eachKey.toLowerCase()] 和其他类似的东西?
      【解决方案4】:

      另一种方法是使用 lodash filter + reduce。

      const arr = [{"id":1,"term_id":5,"type":"car"},{"id":2,"term_id":3,"type":"bike"},{"id":3,"term_id":6,"type":"car"}];
      
      const result = [
        {term_id: 5, type: 'car'},
        {term_id: 6, type: 'car'},
      ].reduce((prev, orCondition) => prev.concat(_.filter(arr, orCondition)), []);
      
      console.log(result);
      <script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script>

      【讨论】:

        猜你喜欢
        • 2019-05-04
        • 1970-01-01
        • 2022-08-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-21
        • 2016-07-19
        • 1970-01-01
        相关资源
        最近更新 更多