Musisz to zrobić krok po kroku, jeśli nie chcesz, TypeError
ponieważ jeśli jeden z członków jest null
lub undefined
i próbujesz uzyskać dostęp do członka, zostanie zgłoszony wyjątek.
Możesz albo po prostu catch
wyjątek, albo utworzyć funkcję testującą istnienie wielu poziomów, coś w tym rodzaju:
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
AKTUALIZACJA ES6:
Oto krótsza wersja oryginalnej funkcji, wykorzystująca funkcje i rekurencję ES6 (ma również odpowiednią formę wywołania ogona ):
function checkNested(obj, level, ...rest) {
if (obj === undefined) return false
if (rest.length == 0 && obj.hasOwnProperty(level)) return true
return checkNested(obj[level], ...rest)
}
Jeśli jednak chcesz uzyskać wartość zagnieżdżonej właściwości i nie tylko sprawdzić jej istnienie, oto prosta funkcja jednowierszowa:
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
Powyższa funkcja pozwala uzyskać wartość zagnieżdżonych właściwości, w przeciwnym razie zwróci undefined
.
AKTUALIZACJA 17.10.2019:
Opcjonalnie propozycja łańcuchowym osiągnęła etap 3 na proces komisji ECMAScript , pozwoli to na bezpieczne dostępu właściwości głęboko zagnieżdżonych, za pomocą tokena ?.
, nowa opcja operator łańcuchowym :
const value = obj?.level1?.level2?.level3
Jeśli którykolwiek z dostępnych poziomów jest null
lub undefined
wyrażenie zostanie rozwiązane undefined
samodzielnie.
Ta propozycja pozwala również bezpiecznie obsługiwać wywołania metod:
obj?.level1?.method();
Powyższe wyrażenie wygeneruje undefined
if obj
, obj.level1
lub obj.level1.method
are null
or undefined
, w przeciwnym razie wywoła funkcję.
Możesz zacząć grać z tą funkcją w Babel za pomocą opcjonalnej wtyczki łańcuchowej .
Od wersji Babel 7.8.0 ES2020 jest domyślnie obsługiwany
Sprawdź ten przykład na Babel REPL.
🎉🎉 AKTUALIZACJA: grudzień 2019 🎉🎉
Opcjonalna propozycja łączenia ostatecznie osiągnęła etap 4 na posiedzeniu komitetu TC39 w grudniu 2019 r. Oznacza to, że ta funkcja będzie częścią standardu ECMAScript 2020 .