Ich benutze meine ruleOut
Funktion zum Filtern von Objekten auf der Grundlage von bestimmte unerwünschte Eigenschaftswerte. Ich verstehe, dass Sie in Ihrem Beispiel Bedingungen anstelle von Werten verwenden möchten, aber meine Antwort ist für den Titel der Frage gültig, also möchte ich meine Methode hier lassen.
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;
});
}
Nehmen wir an, Sie haben eine Liste von Akteuren wie diese:
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"}
];
und Sie möchten alle Schauspieler finden, die als Holywood-Stars eingestuft sind, sollte ihre Nationalität nicht "Englisch", "Italienisch", "Spanisch" oder "Griechisch" sein, und ihr Name sollte nicht "Mary" oder "Joe" sein. Bizarres Beispiel, ich weiß! Wie auch immer, mit dieser Reihe von Bedingungen würden Sie das folgende Objekt erstellen:
let unwantedFieldsFilter= {
userName: ['Mary', 'Joe'],
job: ['actor'],
language: ['English', 'Italian', 'Spanish', 'Greek']
};
OK, wenn Sie jetzt ruleOut(actors, unwantedFieldsFilter)
würden Sie nur erhalten
[{Benutzername: "Bill", Beruf: "star", Sprache: "Türkisch"}]
Und Bill ist dein Mann, denn sein Name ist nicht einer von 'Mary', 'Joe', seine Nationalität ist nicht in ['Englisch', 'Italienisch', 'Spanisch', 'Griechisch'] enthalten und er ist ein Star!
In meiner Methode gibt es eine Option, die lautet applyAllFilters
und ist standardmäßig wahr. Wenn Sie versuchen würden, mit diesem Parameter "false" auszuschließen, würde dies als "OR"-Filterung anstelle von "AND" funktionieren. Beispiel: ruleOut(actors, {job:["actor"], language:["Italian"]}, false)
würden Sie jeden bekommen, der kein Schauspieler oder Italiener ist:
[{Benutzername: "Mary", Job: "Stern", Sprache: "Türkisch"},
{Benutzername: "Takis", Job: "Stern", Sprache: "Griechisch"},
{Benutzername: "Joe", Job: "Stern", Sprache: "Türkisch"},
{Benutzername: "Bill", Job: "Stern", Sprache: "Türkisch"}]