按多个属性和值过滤对象数组

IT技术 javascript filter
2021-01-22 16:01:53

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

例如,在下面的示例中,我可以通过 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"
   }
]

绝对可以使用库,如果它更容易的话。

4个回答

你可以用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)

您可以使用普通的 jsfilter()方法执行此操作,并用于&&测试这两种情况。

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,非常好!是否可以在不循环对象的情况下替换搜索词?我想突出显示结果。
2021-03-21 16:01:53
好的!我正在尝试过滤器,但不知道可以这样做!谢谢!
2021-04-03 16:01:53

以下功能将帮助您。

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

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

结果将被过滤数组。

另一种方法是使用 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>