Devi farlo passo dopo passo se non vuoi un TypeError
perché se uno dei membri lo è null
o undefined
, e provi ad accedere a un membro, verrà generata un'eccezione.
Puoi semplicemente fare catch
un'eccezione o creare una funzione per testare l'esistenza di più livelli, qualcosa del genere:
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
AGGIORNAMENTO ES6:
Ecco una versione più breve della funzione originale, che utilizza le funzionalità ES6 e la ricorsione (è anche nel modulo di chiamata di coda appropriato ):
function checkNested(obj, level, ...rest) {
if (obj === undefined) return false
if (rest.length == 0 && obj.hasOwnProperty(level)) return true
return checkNested(obj[level], ...rest)
}
Tuttavia, se si desidera ottenere il valore di una proprietà nidificata e non solo verificarne l'esistenza, ecco una semplice funzione a una riga:
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
La funzione precedente consente di ottenere il valore delle proprietà nidificate, altrimenti verrà restituito undefined
.
AGGIORNAMENTO 17-10-2019:
La proposta di concatenamento opzionale ha raggiunto la Fase 3 del processo del comitato ECMAScript , questo ti consentirà di accedere in sicurezza alle proprietà profondamente annidate, utilizzando il token ?.
, il nuovo operatore di concatenamento opzionale :
const value = obj?.level1?.level2?.level3
Se uno dei livelli a cui si accede è null
o undefined
l'espressione si risolverà undefined
da sola.
La proposta consente inoltre di gestire in modo sicuro le chiamate di metodo:
obj?.level1?.method();
L'espressione precedente produrrà undefined
se obj
, obj.level1
o obj.level1.method
sono null
o undefined
, altrimenti si chiama la funzione.
Puoi iniziare a giocare con questa funzione con Babel usando il plug-in di concatenamento opzionale .
Da Babel 7.8.0 , ES2020 è supportato per impostazione predefinita
Controlla questo esempio sulla REPL di Babel.
🎉🎉 AGGIORNAMENTO: dicembre 2019 🎉🎉
La proposta di concatenamento opzionale è finalmente arrivata alla fase 4 nella riunione del comitato TC39 del dicembre 2019. Ciò significa che questa funzione farà parte dello standard ECMAScript 2020 .