Avec une seule propriété Ceci est assez facile: mais ce que je veux faire est d'utiliser une propriété imbriquée: p>
var jsonobj = {
"test": {
"test2": "ok"
}
}
var propname = "test.test2";
// Alerts undefined
alert(jsonobj[propname]);
4 Réponses :
Ceci fonctionne, mais utilise plutôt des utilisations de Essayez ici: < un href = "http://jsfiddle.net/tagsu/" rel = "nOfollow noreferrer"> http://jsfiddle.net/tagsu/ p> p> eval code> donc je suis pas em> recommander son utilisation:
Vous obtiendrez toujours un typeError si vous essayez d'accéder à une propriété d'une valeur null / non définie.
... En plus d'autres catastrophes potentielles, ce qui précède pourrait conduire à. C'est pourquoi j'ai désurérogué i> IT;)
Vous pouvez écrire une petite fonction pour diviser la chaîne, puis accéder à chaque pièce à son tour. Par exemple: évidemment, il ne pas un peu de codage supplémentaire pour vérifier les objets NULL, les propriétés valides, etc. p> p>
someObject.a.b.c; //...
Je dois dire que j'aime bien ça. +1
L'inconvénient majeur de cela est qu'il n'y a pas de contrôle d'erreur. Si je crie quelque chose dans le chemin du nœud, non défini code> est renvoyé et vous n'êtes pas plus sage. Il est apparenté à l'utilisation de l'opérateur
@ code> de PHP pour les mêmes extrémités.
@Andy, c'est la nature de la solution. Si vous vouliez des erreurs, pourquoi ne pas utiliser la recherche régulière ( obj.a.b.c code>)? Quoi qu'il en soit, j'ai édité la réponse avec un remède éventuel.
@ J-P: La question a demandé une solution qui a accepté un nombre dynamique de niveaux. Il n'y avait aucune mention de contrôle des erreurs. Cependant, je peux voir certaines situations où aucun contrôle d'erreur ne pourrait être utile, par ex. Dans les services Web qui renvoient JSON avec un niveau de profondeur variable - j'ai travaillé avec ceux qui ont précédemment travaillé (APIS eBay à l'esprit). Au lieu d'avoir à vérifier récursivement que quelque chose existe, vous pouvez utiliser votre méthode ici et vérifier indéfini à la place, ignorez-la et passez à autre chose.
Ce code ne renvoie pas non plus si la valeur de la propriété est "FALSY" I.E 0 ou FAUX ou '' ou NULL? Cela peut (ou peut ne pas) être ce qui est requis.
Cela va évidemment casser si vous avez un nom de propriété contenant un arrêt complet.
Je viens de mettre également en œuvre cela à l'aide d'une fonction de récursif interne, comme:
function get(obj, ns) { function recurse(o, props) { if (props.length === 0) { return o; } if (!o) { return undefined; } return recurse(o[props.shift()], props); } return recurse(obj, ns.split('.')); }
Notez que l'approche récursive bien que plus jolie soit plus lente qu'une approche itérative (au moins dans mes tests)
Voulez-vous dire JSON, ou un objet JavaScript? Ils ne sont pas les mêmes.