Używam mojej ruleOutfunkcji do filtrowania obiektów na podstawie określonych niepożądanych wartości właściwości. Rozumiem, że w twoim przykładzie chciałbyś użyć warunków zamiast wartości, ale moja odpowiedź jest ważna dla tytułu pytania, więc chciałbym zostawić tutaj swoją metodę.
function ruleOut(arr, filterObj, applyAllFilters=true) {
return arr.filter( row => {
for (var field in filterObj) {
var val = row[field];
if (val) {
if (applyAllFilters && filterObj[field].indexOf(val) > -1) return false;
else if (!applyAllFilters) {
return filterObj[field].filter(function(filterValue){
return (val.indexOf(filterValue)>-1);
}).length == 0;
}
}
}
return true;
});
}
Załóżmy, że masz listę takich aktorów:
let actors = [
{userName:"Mary", job:"star", language:"Turkish"},
{userName:"John", job:"actor", language:"Turkish"},
{userName:"Takis", job:"star", language:"Greek"},
{userName:"Joe", job:"star", language:"Turkish"},
{userName:"Bill", job:"star", language:"Turkish"}
];
i chcielibyście znaleźć wszystkich aktorów, którzy zostali sklasyfikowani jako gwiazdy Holywood, ich narodowość nie powinna należeć do „angielskiej”, „włoskiej”, „hiszpańskiej”, „greckiej”, a ich imiona nie będą należeć do „Mary”, „Joe”. Przykład Bizzara, wiem! W każdym razie przy takim zestawie warunków utworzyłbyś następujący obiekt:
let unwantedFieldsFilter= {
userName: ['Mary', 'Joe'],
job: ['actor'],
language: ['English', 'Italian', 'Spanish', 'Greek']
};
OK, teraz jeśli tylko ruleOut(actors, unwantedFieldsFilter)byś to dostał
[{userName: „Bill”, stanowisko: „star”, język: „Turkish”}]
A Bill jest twoim mężczyzną, ponieważ nie ma na imię „Mary”, „Joe”, jego narodowość nie jest uwzględniona w [„angielskim”, „włoskim”, „hiszpańskim”, „greckim”], a ponadto jest gwiazdą!
W mojej metodzie jest jedna opcja, która jest applyAllFiltersi jest domyślnie prawdziwa. Jeśli spróbujesz ustawić regułę z tym parametrem ustawionym na false, zadziała to jak filtrowanie „LUB” zamiast „I”. Przykład: ruleOut(actors, {job:["actor"], language:["Italian"]}, false)sprawiłby, że każdy, kto nie jest aktorem ani Włochem:
[{nazwa użytkownika: „Mary”, praca: „gwiazda”, język: „turecki”},
{nazwa użytkownika: „Takis”, praca: „gwiazda”, język: „grecki”},
{nazwa użytkownika: „Joe”, praca: „star”, język: „turecki”},
{userName: „Bill”, stanowisko: „star”, język: „turecki”}]