请考虑在列表中要过滤的多个过滤器值。在第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)));
});
});
}
答案 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);