L'accès imbriqués les objets JavaScript avec les clés de la chaîne de
J'ai une structure de données comme ceci :
var someObject = {
'part1' : {
'name': 'Part 1',
'size': '20',
'qty' : '50'
},
'part2' : {
'name': 'Part 2',
'size': '15',
'qty' : '60'
},
'part3' : [
{
'name': 'Part 3A',
'size': '10',
'qty' : '20'
}, {
'name': 'Part 3B',
'size': '5',
'qty' : '20'
}, {
'name': 'Part 3C',
'size': '7.5',
'qty' : '20'
}
]
};
Et je voudrais accéder aux données à l'aide de ces variables :
var part1name = "part1.name";
var part2quantity = "part2.qty";
var part3name1 = "part3[0].name";
part1name doit être rempli avec de someObject.part1.name
's de la valeur, qui est "Partie 1". Même chose avec part2quantity, qui a rempli avec 60.
Est-il de toute façon à atteindre ce soit avec javascript ou JQuery?
- Pas sûr de ce que vous demandez ici? Vous voulez être en mesure de requête part1.le nom et le texte "part1.le nom de" retour? Ou vous voulez un moyen d'obtenir la valeur stockée à l'intérieur de part1.nom?
- avez-vous essayé de faire comme
var part1name = someObject.part1name;
` - Je veux requête someObject.part1.nom et retourne la valeur de celui-ci ("Partie 1"). Cependant, je veux la requête (je l'ai appelé "la clé") pour être stocké dans une variable 'part1name'. Merci pour votre réponse. @3nigma : j'ai certainement le faire. Mais ce n'est pas mon intention. Merci pour la réponse.
- dans la double réponse, j'adore l'ex république yougoslave de réponse de stackoverflow.com/questions/8817394/...
- Voir aussi Convertir en JavaScript chaîne en pointillé dans un objet de référence
- Jetez un oeil à JSONPath: github.com/jayway/JsonPath
Vous devez vous connecter pour publier un commentaire.
Je viens de faire ce basé sur un code que j'avais déjà, il semble fonctionner:
Utilisation::
Voir un démo à http://jsfiddle.net/alnitak/hEsys/
MODIFIER certains ont remarqué que ce code renvoie une erreur si elle est transmise d'une chaîne, où la gauche-de la plupart des indices ne correspondent pas à un correctement imbriquées entrée au sein de l'objet. C'est une préoccupation légitime, mais à mon humble avis mieux à même de régler un
try /catch
bloc lors de l'appel, plutôt que d'avoir cette fonction silencieusement retourundefined
pour un index non valide.object
types qui peuvent avoir des propriétés._.get(object, nestedPropertyString);
'part3[0].name.iDontExist'
. Ajout d'une vérification pour voir sio
est un objet dans laif in
résout le problème. (La façon dont vous aller à ce sujet est à vous). Voir mise à jour de violon: jsfiddle.net/hEsys/418Array.prototype
comme une énumération des biens. Parfois, à l'aide defor .. in
peut effectivement être mieux, car il énumère à la fois les indices numériques et toutes les autres propriétés de la chaîne qui ont été délibérément ajoutées au tableau. En tout cas, ce code ne fait pas les utiliserfor .. in
.if (!s) { return o; }
au début.a.reduce((so, k) => so[k], o)
C'est la solution que j'utilise:
Exemple d'utilisation:
Limitations:
[]
) pour les indices de tableau—bien que la spécification d'indices de tableau entre le séparateur de jeton (par exemple,.
) fonctionne correctement, comme indiqué ci-dessus._.reduce()
de le trait de soulignement ou lodash de la bibliothèque)self
est probablement pas défini ici. Voulez-vous direthis
?self
est défini.this
serait incorrect._.reduce(path.split('.'), (previous, current) => !safe ? previous[current] : (previous ? previous[current] : undefined), target || self);
function resolve(properties, obj=self) { return properties.reduce((prev, curr) => prev && prev[curr], obj) }
et vous pouvez l'utiliser comme ceciresolve(["style","width"], document.body)
C'est maintenant pris en charge par lodash à l'aide de
_.get(obj, property)
. Voir https://lodash.com/docs#getExemple de la doc:
_.set(...)
_.get
montrent le même comportement que quand aucune touche n'est trouvé dans la condition d'objet. par exemple_.get(null, "foo") -> undefined
,_.get(null, "foo", "bar") -> "bar"
. Cependant, ce comportement n'est pas défini dans les documents soumis à modification.Vous auriez à analyser la chaîne vous-même:
Il a fallu que vous pouvez également définir les indices de tableau avec la notation point:
Il rend l'analyse plus facile.
DÉMO
[]
syntaxe syntaxe de la propriété est assez trivial.while (l > 0 && (obj = obj[current]) && i < l)
ensuite ce code fonctionne pour les chaînes sans points ainsi.Fonctionne pour les tableaux /tableaux à l'intérieur de l'objet.
Défensive contre des valeurs non valides.
JS:
HTML:
ES6: une Seule ligne dans Vanila JS (il retourne la valeur null si ne trouvez pas, au lieu de donner de l'erreur):
ou exemple:
Pour un prêt à utiliser la fonction qui reconnaît également faux, 0 et nombre négatif et d'accepter les valeurs par défaut du paramètre:
Exemple d'utilisation:
Bonus:
À ensemble un chemin d'accès (Demandé par @rob gordon), vous pouvez utiliser:
Exemple:
Accéder au tableau avec []:
exemple
let o = {a:{b:{c:1}}}; let str = 'a.b.c'; str.split('.').splice(0, str.split('.').length - 1).reduce((p,c)=>p&&p[c]||null, o)[str.split('.').slice(-1)] = "some new value";
0
,undefined
etnull
valeurs.{a:{b:{c:0}}}
retournenull
au lieu de0
. Peut-être explicitement la vérification de la valeur null ou undefined permettra d'éclaircir ces questions.(p,c)=>p === undefined || p === null ? undefined : p[c]
Reflect.has(o, k) ? ...
(ES6 Réfléchir.a) a travaillé sisetPath
sera mis à la valeur sur la première occurrence de la dernière sélection. Par exemplelet o = {}; setPath(o, 'a.a', 0)
résultats dans{a: 0}
plutôt que{a: {a: 0}}
. voir ceci post pour trouver une solution.en utilisant eval:
envelopper de retour pas défini en cas d'erreur
http://jsfiddle.net/shanimal/b3xTw/
Veuillez utiliser le bon sens et la prudence lorsque vous utilisez la puissance de eval. C'est un peu comme un sabre laser, si vous le mettez sur, il y a 90% de chance que vous allez couper une branche. Ce n'est pas pour tout le monde.
Vous pouvez gérer pour obtenir la valeur d'une profonde membre de l'objet avec la notation point sans JavaScript externe de la bibliothèque avec la simple astuce suivante:
Dans votre cas, afin d'obtenir la valeur de
part1.name
desomeObject
viens de faire:Ici est un simple violon démo: https://jsfiddle.net/harishanchu/oq5esowf/
Ce ne sera probablement jamais voir la lumière du jour... mais ici, il est de toute façon.
[]
support de la syntaxe avec.
.
caractèreundefined
)JS:
C'est un liner avec lodash.
Ou encore mieux...
Ou ES6 version w/réduire...
Plunkr
Je pense que vous demandez ceci:
Vous pourriez poser pour cette:
De travail
Ou peut-être vous demandez ce
Enfin, vous pourriez poser pour cette
Split
méthode, mais plutôtsplit
.Ici, je vous offre plus de moyens, ce qui semble plus rapide à de nombreux égards:
Option 1: scinde une chaîne sur . ou [ ou ] ou " ou ", inverse, de l'ignorer des éléments vides.
Option 2 (le plus rapide de tous, à l'exception de
eval
): le niveau Faible de caractère scan (pas de regex/split/etc, juste un petit char d'analyse).Remarque: celui-ci ne prend pas en charge les devis pour les index.
Option 3: (nouveau: option 2 étendu à l'appui de citations - un peu plus lent, mais toujours rapide)
JSPerf: http://jsperf.com/ways-to-dereference-a-delimited-property-string/3
"eval(...)" est toujours le roi si (performance sage qui est). Si vous avez de la propriété des chemins directement sous votre contrôle, il ne devrait pas y avoir de problèmes avec l'utilisation de 'eval' (surtout si la vitesse est souhaitée). Si le tirant de la propriété des chemins "sur le fil" (sur la ligne!? lol :P), alors oui, utiliser autre chose pour être en sécurité. Seul un idiot pourrait dire de ne jamais utiliser de "eval", comme il Les raisons SONT bonnes quand l'utiliser. Aussi, "Il est utilisé dans Doug Crockford du parseur JSON." Si l'entrée est en sécurité, pas de problèmes à tous. Utiliser le bon outil pour le bon travail, c'est tout.
Speigg l'approche est très soigné et propre, mais j'ai trouvé cette réponse lors de la recherche de la solution d'accès à AngularJS $propriétés de portée par chemin de chaîne et avec un peu de modification, il fait le travail:
Il suffit de placer cette fonction dans la racine de votre contrôleur et de l'utiliser à n'importe quel enfant de la portée comme ceci:
Juste au cas où, de toute personne visitant cette question en 2017 ou plus tard, et à la recherche d'un facile à retenir, voici élaborer un billet de blog sur Accéder à des Objets Imbriqués dans JavaScript sans être dupés par
Impossible de lire la propriété 'foo' undefined erreur
Accès Des Objets Imbriqués À L'Aide Du Tableau De Réduire
Prenons l'exemple de la structure
Pour être en mesure d'accéder à des tableaux imbriqués, vous pouvez écrire votre propre tableau de réduire util.
Il est également un excellent type de manipulation minimale de la bibliothèque typés que signifie tout cela pour vous.
Avec typés, votre code devrait ressembler à ceci
Avertissement: je suis l'auteur de ce forfait.
Je n'ai pas encore trouvé un paquet à faire toutes les opérations avec un string path, donc j'ai fini par écrire mon propre petit paquet qui prend en charge insert(), get() (avec retour par défaut), set() et remove() opérations.
Vous pouvez utiliser la notation point, entre parenthèses, le nombre d'indices, chaîne nombre de propriétés, et les touches avec les caractères de mot. Simple d'utilisation ci-dessous:
https://www.npmjs.com/package/jsocrud
https://github.com/vertical-knowledge/jsocrud
Fonction Simple, permettant soit une chaîne ou un tableau de chemin.
OU
Il y a un
npm
module pour ce faire: https://github.com/erictrinh/safe-accessExemple d'utilisation:
Fonctionne avec
En réduire le est bon, je suis surpris que personne n'utilisait forEach:
Test
a.b.c
va lever une exception si il n'y a pas de propriétéb
dans votre objet. Si vous avez besoin de quelque chose en silence rejetant le mauvais chemin d'accès clé (que je ne recommande pas), vous pouvez toujours remplacer le forEach avec celui-cikeys.forEach((key)=> obj = (obj||{})[key]);
Inspiré par @webjay de réponse:
https://stackoverflow.com/a/46008856/4110122
J'ai fait une fonction qui pouvez-vous l'utiliser pour Obtenir/Définir/Annuler toute valeur dans l'objet
Pour l'utiliser:
Si vous avez besoin d'accéder à différentes imbriquées clé, sans le savoir, au codage du temps (il va être facile de les aborder) vous pouvez utiliser la notation de tableau accesseur:
Ils sont l'équivalent de la dot notation accesseur et peut varier au moment de l'exécution, par exemple:
est équivalent à
ou
J'espère que cette adresse à votre question...
MODIFIER
Je ne vais pas utiliser une chaîne à mantain une sorte de xpath requête d'accéder à un objet de valeur.
Comme vous l'avez d'appeler une fonction pour analyser la requête et récupérer la valeur que je voudrais suivre un autre chemin (pas :
ou, si vous êtes mal à l'aise avec la appliquer méthode
Les fonctions sont plus courts, plus clairs, l'interprète de les vérifier pour vous pour les erreurs de syntaxe et ainsi de suite.
Par la manière, je pense qu'une simple assignation faite au bon moment sera suffisante...
Juste eu la même question récemment et avec succès utilisé https://npmjs.org/package/tea-properties qui a également
set
objet imbriqué/tableaux :obtenir:
ensemble:
Les solutions sont ici juste pour accéder à l'profondément imbriqués les touches. J'en avais besoin pour accéder, ajouter, modifier et supprimer les clés. C'est ce que je suis venu avec:
path_to_key
: chemin d'accès dans un tableau. Vous pouvez le remplacer par votrestring_path.split(".")
.type_of_function
: 0 pour l'accédant(ne pas passer toute valeur àvalue
), 0 pour ajouter et modifier. 1 pour la suppression.Au lieu d'une chaîne en un tableau peut être utilisé de tels objets imbriqués et des tableaux par exemple:
["my_field", "another_field", 0, "last_field", 10]
Voici un exemple qui permettrait de modifier un champ basé sur ce tableau de la représentation. Je suis en utilisant quelque chose comme ça dans react.js pour contrôler l'entrée des champs qui changent l'état des structures imbriquées.
Basée sur une précédente réponse, j'ai créé une fonction qui peut également gérer les supports. Mais pas de points à l'intérieur d'eux en raison de la scission.
JS:
De travail avec
Underscore
'sproperty
oupropertyOf
:JS:
HTML:
Bonne Chance...
Je suis le développement de boutique en ligne à Réagir. J'ai essayé de changer les valeurs dans copié d'état de l'objet à mettre à jour l'état original avec elle sur "soumettre".
Les exemples ci-dessus n'ont pas bien fonctionné pour moi, parce que la plupart d'entre eux de mutation de la structure de l'objet copié. J'ai trouvé un exemple fonctionnel de la fonction permettant d'accéder et de modifier les valeurs de la profondeur de l'objet imbriqué propriétés: https://lowrey.me/create-an-object-by-path-in-javascript-2/ Ici, il est:
Extension de Mohamad Hamouday Réponse de remplir touches manquantes
Exemple
Quoi au sujet de cette solution:
Et celui-ci, pour obtenir:
Probablement certains les considèrent dangereux, mais ils doivent être beaucoup plus rapide ensuite, l'analyse de la chaîne.
Construction de Alnitak réponse:
}
Cela vous permet de définir la valeur et de la!
J'ai créé un package npm et github avec ce même