2 votes

Transformer un arbre de manière récursive en JS/ES6

J'essaie actuellement de transformer un arbre, donné par dans ce formulaire :

{"Parent": 
    {
    "Child1": ["toy1"],
    "Child2": 
          {
              "Nephew": ["toy2", "toy3"]
          }
    }
}

en un arbre de la forme suivante :

{
"name": "root",
"children": 
    [{"name":"Parent",
      "children": 
          [{
          "name":"Child1",
          "children": ["toy1"]
          },
          {
          "name":"Child2"
          "children": 
              [{
              "name":"Nephew",
              "children": ["toy2", "toy3"]
              }]
          }]
    }]
}

En gros, je veux normaliser la structure de l'arbre. J'ai essayé cela avec le code suivant :

function recurse(elem) {
    if (typeof(elem) !== "object") return elem;
    level = [];
    for (let part in elem) {
        level.push({
            name: part,
            children: recurse(elem[part])
        });
        console.log(level);
    }
    return level;
}
restrucTree = {
    name: "root",
    children: recurse(tree)
};

Mais apparemment, il y a des erreurs concernant la récursion correcte et la construction de l'objet puisque le nœud racine (dans ce cas "Parent") n'est pas inclus dans l'arbre transformé. De plus, cette méthode échoue si l'arbre se ramifie en plusieurs sous-arbres. Dans ce cas, seul le dernier est reconnu. Mon hypothèse la plus probable est que, lors de l'extraction de la pile de la récursion, des objets stockés sont perdus, mais je n'arrive pas à traduire cela en une solution. Si vous avez une idée de l'origine de cette erreur, je vous en serais très reconnaissant !

0voto

Nina Scholz Points 17120

Vous pourriez adopter une approche récursive et itérer toutes les clés, construire de nouveaux objets et prendre soit le tableau, soit l'objet pour le prochain appel récursif.

function getParts(object) {
    return Array.isArray(object)
        ? object
        : Object.keys(object).map(function (k) {
            return { name: k, children: getParts(object[k]) };
        });
}

var data = { Parent: { Child1: ["toy1"], Child2: { Nephew: ["toy2", "toy3"] } } },
    result = { name: 'root', children: getParts(data) };

console.log(result);

.as-console-wrapper { max-height: 100% !important; top: 0; }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X