2
votes

Accéder en toute sécurité à une propriété dans un objet javascript imbriqué

La structure de l'objet est la suivante.

object && obj1 && obj2 && obj2.name

Cette structure est dynamique et parfois il n'y aura pas d'obj1.

Donc, In react vous allez écrire le code comme ..

object = {
  obj1: {
    obj2: {
       name: 'MY name'
    }
  }
}

de sorte que seulement si object, obj1 et obj2 sont présents alors obj2.name sera affiché.

Dans ce cas, il n'y aura pas d'erreur indéfinie car la présence de chaque objet est vérifiée avant d'entrer dans la fonction.

Existe-t-il une alternative au code ci-dessus pour qu'il affiche le nom lorsque tous les objets sont présents. Sinon, cela ne devrait pas générer d'erreur.


6 commentaires

Vous pourriez juste attraper l'erreur


Jetez un œil à lodash.get .


… Ou écrivez quelque chose qui obtient le «chemin» de la propriété sous forme de chaîne - puis divisez-le et vérifiez récursivement si le «suivant» est défini ou non.


Double possible de l'objet stackoverflow.com/questions/33444711 /…


Avez-vous trouvé une réponse à votre question?


J'ai utilisé lodash.get


4 Réponses :


0
votes

Utilisez hasOwnProperty pour vérifier si obj1 est présent ou non

object = {
  obj1: {
    obj2: {
       name: 'MY name'
    }
  }
}
if(object.hasOwnProperty('obj1'))
console.log(object.obj1.obj2.name)
else
console.log(object.obj2.name)


0 commentaires

0
votes

Essayez

object = {
  obj1: {
    obj2: {
       name: 'MY name'
    }
  }
}
    
var name = (object.hasOwnProperty('obj1'))  ? object.obj1.obj2.name : object.obj2.name;
console.log(name);


0 commentaires

-1
votes

Je recommanderais d'écrire une fonction récursive qui inspecte l'objet et récursent ses enfants si un nom est trouvé. Je vois que d'autres ont suggéré d'attraper l'erreur - Je déconseille d'abuser de la gestion des exceptions pour des erreurs d'exécution comme celle-ci.


0 commentaires

0
votes

Vous devez vérifier chaque propriété avant d'en lire une imbriquée:

const obj = { obj1: { obj2: { name: 'Hello' } } }

function safeEval(fn) {
  try { return fn(); }
  catch { return undefined; }
}

const a = obj && obj.obj1 && obj.obj1.obj2 && obj.obj1.obj2.name;
const b = safeEval(() => obj.obj1.obj2.name);
const c = safeEval(() => obj.obj1.obj2.obj3.obj4.name);

console.log(a, b, c);

C'est laborieux et détaillé car vous devez répéter la même chose encore et encore pour accéder à des propriétés profondément imbriquées. p>

Je suggère d'utiliser une fonction safeEval qui enveloppe votre code d'accès de propriété potentiellement dangereux avec un try / catch et renvoie undefined si une erreur se produit. C'est beaucoup plus court que de vérifier manuellement chaque propriété:

const name = safeEval(() => obj.obj1.obj2.name);

Voici un exemple:

const name = object && object.obj1 && object.obj1.obj2 && object.obj1.obj2.name;


0 commentaires