Mon objectif est celui-ci:
dire si j'ai une référence p> puis en utilisant une chaîne comme Je suis conscient que nous pouvons toujours obtenir la valeur d'une profondeur ci-dessous (par exemple "ABCD" code> (qui n'est pas connu à l'avance), je veux pouvoir transversir l'objet et obtenir la valeur de
d code> (ou retourner
null code> / lancer
erreur code> ). p>
a ["B"] code> et ainsi de suite), puis ce peut être obtenu en utilisant le
.split () code> puis utilisez des boucles ou de la récursivité, mais j'espérais qu'il y avait une méthode plus simple, une étape à une étape de le faire. P> P>
3 Réponses :
Oui, il existe une solution simple, placez la chaîne à l'intérieur de l'eval et placez l'EVAL à l'intérieur TRY / CATCH
const a = {b:{c:{d:"test"}}}; try{ console.log(eval("a.b.c.d")); // test }catch(e){}
Il n'y a pas d'autre moyen de le faire sans utiliser des boucles. p> eval () code> peut le faire mais ce n'est pas recommandé.
const obj = {
a: {
b: {
c:{
d: {
someprop:"x"
}
}
}
}
}
const getProp = (obj,depth) => [...Array(depth)].reduce((ac,a) => (Object.values(ac)[0] || {}),obj)
console.log(getProp(obj,4))
Comme vous l'avez dit que, les clés ne sont pas connues à l'avance, puis la récursion ou une boucle serait la voie à suivre:
Puis, en utilisant une chaîne comme "a.b.c.d" (qui n'est pas connu à l'avance), Je veux pouvoir transversir l'objet et obtenir la valeur de d (ou Retour Null / Three Error). P> blockQuote>
p>
const object = { a: { b: { c:{ d: { foo : "bar" } } } } }; function getNestedData(obj){ if(!obj){ return null; } if(Object.values(obj).filter(val => typeof val !== "object").length){ return (Object.values(obj)[0] || {}); } return getNestedData(Object.values(obj)[0] || {}); } console.log(getNestedData(object));
Les boucles sont simples. Vous pouvez utiliser sur la doublure avec
réduire () code>. Une autre façon est
eval () code> qui n'est pas recommandé
Vous pouvez utiliser Lodash si vous l'utilisez déjà autre que vous pouvez utiliser
tableau # réduire code>.
@Jeto
a.b.c.d code> n'est pas connu à l'avance @maheerali @ hassan-imam tous les exemples que je pourrais utiliser? Si posté comme une réponse, je peux l'accepter
@Divyanshgoenka Cela vous aidera lodash.com/docs/4.17.11#get
@Hassanimam vous semble être le meilleur attelage maintenant, si cela est donné comme une réponse, je peux accepter
@Divyanshgoenka J'ai édité le message selon a.b.c.d n'est pas connu à l'avance i>. S'il vous plaît vérifier et mentionnez également des exigences importantes comme celle-ci dans le poste.
@Hassanimam, bien que j'ai marqué comme une dupliquée mais imo, la méthode de Lodash est plus conviennante et utilisera cela
Oui, vous pouvez utiliser Lodash. Bonne chance.