0
votes

JavaScript - transversal imbriqué dynamique

Mon objectif est celui-ci:

dire si j'ai une référence xxx

puis en utilisant une chaîne comme "ABCD" (qui n'est pas connu à l'avance), je veux pouvoir transversir l'objet et obtenir la valeur de d (ou retourner null / lancer erreur ).

Je suis conscient que nous pouvons toujours obtenir la valeur d'une profondeur ci-dessous (par exemple a ["B"] et ainsi de suite), puis ce peut être obtenu en utilisant le .split () 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.


8 commentaires

Les boucles sont simples. Vous pouvez utiliser sur la doublure avec réduire () . Une autre façon est eval () qui n'est pas recommandé


Vous pouvez utiliser Lodash si vous l'utilisez déjà autre que vous pouvez utiliser tableau # réduire .


@Jeto a.b.c.d 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 . 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.


3 Réponses :


0
votes

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){}


0 commentaires

1
votes

Il n'y a pas d'autre moyen de le faire sans utiliser des boucles. eval () code> peut le faire mais ce n'est pas recommandé.

p>

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))


0 commentaires

0
votes

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));


0 commentaires