Sie müssen Schritt für Schritt vorgehen, wenn Sie nicht wollen, dass ein TypeError
denn wenn eines der Mitglieder null
o undefined
und Sie versuchen, auf ein Mitglied zuzugreifen, wird eine Ausnahme ausgelöst.
Sie können entweder einfach catch
die Ausnahme, oder erstellen Sie eine Funktion zum Testen des Vorhandenseins mehrerer Ebenen, etwa so:
function checkNested(obj /*, level1, level2, ... levelN*/) {
var args = Array.prototype.slice.call(arguments, 1);
for (var i = 0; i < args.length; i++) {
if (!obj || !obj.hasOwnProperty(args[i])) {
return false;
}
obj = obj[args[i]];
}
return true;
}
var test = {level1:{level2:{level3:'level3'}} };
checkNested(test, 'level1', 'level2', 'level3'); // true
checkNested(test, 'level1', 'level2', 'foo'); // false
ES6 UPDATE:
Hier ist eine kürzere Version der ursprünglichen Funktion, die ES6-Funktionen und Rekursion verwendet (sie ist auch in richtiger Schwanzruf Form):
function checkNested(obj, level, ...rest) {
if (obj === undefined) return false
if (rest.length == 0 && obj.hasOwnProperty(level)) return true
return checkNested(obj[level], ...rest)
}
Wenn Sie jedoch den Wert einer verschachtelten Eigenschaft abrufen und nicht nur ihr Vorhandensein überprüfen möchten, finden Sie hier eine einfache einzeilige Funktion:
function getNested(obj, ...args) {
return args.reduce((obj, level) => obj && obj[level], obj)
}
const test = { level1:{ level2:{ level3:'level3'} } };
console.log(getNested(test, 'level1', 'level2', 'level3')); // 'level3'
console.log(getNested(test, 'level1', 'level2', 'level3', 'length')); // 6
console.log(getNested(test, 'level1', 'level2', 'foo')); // undefined
console.log(getNested(test, 'a', 'b')); // undefined
Die obige Funktion ermöglicht es Ihnen, den Wert von verschachtelten Eigenschaften zu erhalten, andernfalls wird zurückgegeben undefined
.
UPDATE 2019-10-17:
El optionaler Verkettungsvorschlag erreichte Stufe 3 der Verfahren des ECMAScript-Ausschusses können Sie sicher auf tief verschachtelte Eigenschaften zugreifen, indem Sie das Token ?.
die neue optionaler Verkettungsoperator :
const value = obj?.level1?.level2?.level3
Wenn eine der aufgerufenen Ebenen null
o undefined
wird der Ausdruck aufgelöst in undefined
von selbst.
Der Vorschlag ermöglicht es Ihnen auch, Methodenaufrufe sicher zu handhaben:
obj?.level1?.method();
Der obige Ausdruck ergibt undefined
si obj
, obj.level1
, oder obj.level1.method
sind null
o undefined
, ansonsten wird die Funktion aufgerufen.
Sie können mit dieser Funktion mit Babel spielen, indem Sie die optionales Verkettungs-Plugin .
Desde Babel 7.8.0 ES2020 wird standardmäßig unterstützt.
Siehe dieses Beispiel auf der Babel REPL.
UPDATE: Dezember 2019
Der fakultative Verkettungsvorschlag schließlich Stufe 4 erreicht in der Dezember-Sitzung 2019 des Ausschusses TC39. Das bedeutet, dass diese Funktion Teil der ECMAScript 2020 Standard.
1 Stimmen
Sie sollten sich vielleicht eine tangential verwandte Frage ansehen, die kürzlich gestellt wurde stackoverflow.com/questions/2525943/
0 Stimmen
Siehe auch stackoverflow.com/questions/10918488/
0 Stimmen
Ein paar Vorschläge dazu: stackoverflow.com/a/18381564/1636522
0 Stimmen
Ihr aktueller Ansatz hat ein potenzielles Problem, wenn level3 Eigenschaft ist ein false, in diesem Fall, auch wenn die Eigenschaft vorhanden ist retur nfalse haben einen Blick auf dieses Beispiel bitte jsfiddle.net/maz9bLjx
13 Stimmen
Sie können auch einfach try catch verwenden
0 Stimmen
Ich bin gerade dabei, eine Frage zu stellen und zu fragen, ob die Verwendung eines
try/catch
Das ist eine gute Idee, denn ich habe das in letzter Zeit gemacht und vermisse Kaffeeskripte.?
das dies für Sie tut lol.0 Stimmen
Siehe diesen Link für die Antwort stackoverflow.com/questions/2281633/javascript-isset-equivalent/
0 Stimmen
Optionale Verkettung ist das, was Sie wollen stackoverflow.com/a/60845999/2100372
0 Stimmen
Es wird eine rekursive Lösung benötigt, die allgemein verwendet werden kann, um tief verschachtelte Schlüssel zu finden. Diese Beitrag könnte helfen.