如果有多个过滤器值,则在javascript中过滤器数组会删除未找到的项目

时间:2019-07-02 20:51:41

标签: javascript

请考虑在列表中要过滤的多个过滤器值。在第1次迭代中,如果第一个过滤器值与列表中的任何项目都不匹配,则所有项目都将被删除,并且我将没有任何元素可以使用第二个过滤器值来过滤列表。

我正在尝试使用以下代码在javascript中过滤我的数组。我有一个管理员列表,我想根据事件ID过滤管理员。如果我有两个要使用列表过滤的事件ID,则以下代码将失败。

if(aEventIds.length > 0) {
        aEventIds.forEach(function(eventId) {
          aAdminList = aAdminList.filter(function(item) {
            searchedOrFiltered = true;
            return (item.event_ids.includes(parseInt(eventId)));
          });
        });
      }

1 个答案:

答案 0 :(得分:1)

Array.prototype.filter回调函数应返回一个布尔值,指示是否保留当前迭代的值。您需要做的就是反转逻辑,以便过滤器考虑每个id,而不是每个id都用于执行单独的过滤。

因此,如果这是对ID的“或”运算,则此操作:

let aAdminList = [{event_ids: [1, 5, 8]},{event_ids: [3, 6, 9]},{event_ids: [2, 4, 8]}];
let aEventIds = [5, 8];

let output = aAdminList.filter(item => {
  searchedOrFiltered = true;
  let result = [];
  aEventIds.forEach(eventId => {
    result.push(item.event_ids.includes(parseInt(eventId)));
  });
  // OR OP
  return result.includes(true);
});

console.log(output);

否则,如果这是对ID的AND操作,则此操作:

let aAdminList = [{event_ids: [1, 5, 8]},{event_ids: [3, 6, 9]},{event_ids: [2, 4, 8]}];
let aEventIds = [5, 8];

let output = aAdminList.filter(item => {
  searchedOrFiltered = true;
  let result = [];
  aEventIds.forEach(eventId => {
    result.push(item.event_ids.includes(parseInt(eventId)));
  });
  // AND OP
  return result.every(i=>i===true);
});

console.log(output);