Sagen wir, wir haben ein JS-Objekt:
%Vor% Wie können wir überprüfen, ob die Eigenschaft value
existiert?
Ich kann nur zwei Möglichkeiten sehen:
Erster:
%Vor%Zweiter:
%Vor%Aber gibt es eine Möglichkeit, eine gründliche Überprüfung durchzuführen? Sagen wir mal so etwas wie:
%Vor%oder
%Vor% Es gibt keine integrierte Möglichkeit für diese Art von Prüfung, aber Sie können es leicht implementieren. Erstellen Sie eine Funktion, übergeben Sie eine Zeichenfolge, die den Eigenschaftspfad darstellt, teilen Sie den Pfad nach .
und durchlaufen Sie diesen Pfad:
Sie können dazu eine einfache rekursive Methode erstellen.
Die Methode würde (rekursiv) auf alle Objekteigenschaften des übergebenen Objekts iterieren und true
zurückgeben, sobald ein Objekt gefunden wird, das die übergebene Eigenschaft enthält. Wenn kein Objekt eine solche Eigenschaft enthält, wird es zurückgegeben false
.
Alternative rekursive Funktion:
Überlappt alle Objektschlüssel, prüft bei jedem Schlüssel, ob es sich um ein Objekt handelt und ruft in diesem Fall rekursiv auf.
Andernfalls wird Array mit true, false, false für jeden Schlüssel mit dem Namen propName
zurückgegeben.
Das .reduce
rollt dann das Array durch eine Anweisung oder zusammen.
PS: @ nems Antwort zeigte, wie es leistungsfähiger sein könnte: Seine Lösung bricht beim ersten gefundenen "Wert" ab.
Mein Ansatz würde Try / Catch-Blöcke verwenden. Weil ich tiefe Eigenschaftspfade in Strings nicht mag. Ich bin ein fauler Kerl, der Autovervollständigung mag:)
Javascript-Objekte werden zur Laufzeit ausgewertet. Wenn Sie also Ihre Objektanweisung in einer Callback-Funktion zurückgeben, wird diese Anweisung erst ausgewertet, wenn die Callback-Funktion aufgerufen wird.
Diese Funktion umschließt also nur die Callback-Funktion innerhalb einer try catch-Anweisung. Wenn es die Ausnahme abruft, wird false zurückgegeben.
Wenn es um Leistung geht, ist es schwer zu sagen, welcher Ansatz besser ist. Bei meinen Tests, wenn die Objekteigenschaften existieren und die Anweisung erfolgreich ist, habe ich festgestellt, dass try / catch zweimal 3x mal schneller sein kann als das Teilen von Strings in Keys und Prüfen, ob Schlüssel im Objekt existieren.
Aber wenn die Eigenschaft zu einem bestimmten Zeitpunkt nicht existiert, gibt der Prototyp-Ansatz das Ergebnis fast 7x schneller zurück.
Sehen Sie sich den Test selbst an: Ссылка
Sie können auch die Bibliothek durchsuchen, die ich hier geschrieben habe: Ссылка
Wenn Sie JavaScript für Node schreiben, gibt es ein Modul mit einer 'deepEqual' Methode
%Vor%Tags und Links javascript