Das JS-Objekt verfügt über eine Deep-Check-Eigenschaft

8

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%     
BadVolt 30.10.2015, 20:50
quelle

6 Antworten

11

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:

%Vor%     
Viktor Bahtev 30.10.2015, 21:20
quelle
7

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 .

%Vor%
    
nem035 30.10.2015 21:13
quelle
3

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.

%Vor%

PS: @ nems Antwort zeigte, wie es leistungsfähiger sein könnte: Seine Lösung bricht beim ersten gefundenen "Wert" ab.

    
wintvelt 30.10.2015 21:22
quelle
0

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.

%Vor%

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: Ссылка

    
mehmatrix 30.08.2017 11:45
quelle
0

Versuchen Sie diese nette und einfache Lösung:

%Vor%     
Riccardo Cassano 11.11.2017 17:37
quelle
0

Wenn Sie JavaScript für Node schreiben, gibt es ein Modul mit einer 'deepEqual' Methode

%Vor%     
Rolf 19.03.2018 19:27
quelle

Tags und Links