Sie müssen es Schritt für Schritt tun, wenn Sie keine möchten, TypeError
denn wenn eines der Mitglieder null
oder istundefined
eine Ausnahme ausgelöst wird, ist und Sie versuchen, auf ein Mitglied zuzugreifen.
Sie können entweder einfach catch
die 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, null
oder undefined
der Ausdruck sich undefined
von selbst auflöst .
Mit dem Vorschlag können Sie auch Methodenaufrufe sicher verarbeiten:
obj?.level1?.method();
Der obige Ausdruck erzeugt, undefined
wenn obj
, obj.level1
oder obj.level1.method
sind null
oder 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.