Мне пришлось немного интерпретировать ваш вопрос. Итак, в следующем коде мы проверяем, есть ли для каждого фильтра все элементы значения свойства фильтра также в указанном свойстве объекта вендора (в основном операция подмножества). Если вы имели в виду любой элемент для каждого фильтра, вам нужно использовать операцию пересечения.
Чтобы реализовать это, мы можем использовать reduce
для итерации и суммировать отдельные проверки с помощью &&
(функция isSupersetOf
). Чтобы применить это для каждого свойства фильтра, мы можем применить ту же технику к набору записей (функция isMatch
).
Обратите внимание, что мне также пришлось настроить имена свойств, чтобы это работало.
Код:
var vendors = [
{
vendor_name: "John",
region: ["APAC", "UKDE"],
scanned_status: "Yes",
channel: ["FILE", "API"],
pii_attributes: ["A", "B"]
},
{
vendor_name: "Onir",
region: ["APAC", "LATAM"],
scanned_status: "No",
channel: ["FILE"],
pii_attributes: ["A", "C"]
},
{
vendor_name: "Suresh",
region: ["UKDE", "NA"],
scanned_status: "Yes",
channel: ["API"],
pii_attributes: ["C", "B"]
},
// Add a match for illustration
{
vendor_name: "Denep",
region: ["APAC", "LATAM", "NA"],
scanned_status: ["Yes"],
channel: ["API"],
pii_attributes: ["A", "B", "C"]
}
];
const filterCriteria = {
region: ["APAC", "LATAM"], // 'APAC', 'LATAM', 'NA', 'UKDE'
channel: ["API"], // 'API', 'FILE'
pii_attributes: ["A", "B"],
scanned_status: ["Yes"] // 'Yes', 'No', 'All'
};
const isSupersetOf = (subset, superset) =>
subset.reduce((result, next) => result && superset.includes(next), true);
const isMatch = (filter, element) =>
Object.entries(filter)
.reduce((result, [property, values]) => result && isSupersetOf(values, element[property] || []), true)
const filteredVendors = vendors.filter((el, index, arr) =>
isMatch(filterCriteria, el))
console.log(filteredVendors);