Sie müssen es Schritt für Schritt tun, wenn Sie keine möchten, TypeErrordenn wenn eines der Mitglieder nulloder istundefined eine Ausnahme ausgelöst wird, ist und Sie versuchen, auf ein Mitglied zuzugreifen.
Sie können entweder einfach catchdie Ausnahme oder eine Funktion zum Testen der Existenz mehrerer Ebenen erstellen:
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 (auch in richtigen Tail-Call- 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 ihre Existenz ü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
Mit der obigen Funktion können Sie den Wert verschachtelter Eigenschaften abrufen, andernfalls wird zurückgegeben undefined.
UPDATE 2019-10-17:
Der optionale Verkettungsvorschlag hat Stufe 3 des ECMAScript-Ausschussprozesses erreicht. Auf diese Weise können Sie mithilfe des Tokens ?., des neuen optionalen Verkettungsoperators , sicher auf tief verschachtelte Eigenschaften zugreifen :
const value = obj?.level1?.level2?.level3
Wenn eine der Ebenen ist, auf die zugegriffen wird, nulloder undefinedder Ausdruck sich undefinedvon selbst auflöst .
Mit dem Vorschlag können Sie auch Methodenaufrufe sicher verarbeiten:
obj?.level1?.method();
Der obige Ausdruck erzeugt, undefinedwenn obj, obj.level1oder obj.level1.methodsind nulloder undefined, sonst ruft er die Funktion auf.
Sie können mit dieser Funktion mit Babel über das optionale Verkettungs-Plugin spielen .
Seit Babel 7.8.0 wird ES2020 standardmäßig unterstützt
Überprüfen Sie dieses Beispiel auf der Babel REPL.
🎉🎉UPDATE: Dezember 2019 🎉🎉
Der optionale Verkettungsvorschlag erreichte schließlich Stufe 4 in der Sitzung des TC39-Ausschusses im Dezember 2019. Dies bedeutet, dass diese Funktion Teil des ECMAScript 2020- Standards sein wird.