67 votes

Comment trouver un nœud dans un arbre avec JavaScript

J'ai un objet littéral qui est essentiellement un arbre qui n'a pas un nombre fixe de niveaux. Comment puis-je rechercher un nœud particulier dans l'arbre et renvoyer ce nœud lorsqu'il est trouvé de manière efficace en javascript ?

Essentiellement, j'ai un arbre comme celui-ci et je voudrais trouver le nœud avec le titre 'randomNode_1'.

var data = [
{
title: 'topNode',
 children: [
   {
       title: 'node1',
       children: [
       {
           title: 'randomNode_1'
       },
       {   
           title: 'node2',
           children: [
           {
               title: 'randomNode_2',
               children:[
               {   
                   title: 'node2',
                   children: [
                   {
                       title: 'randomNode_3',
                   }]
               }
               ]
           }]
       }]
   }
  ]
 }];

2 votes

Avez-vous essayé la récursion ?

59 votes

@ShoaibShaikh : Pour comprendre la récursion, il faut d'abord comprendre la récursion.

1 votes

Votre structure de données ressemble-t-elle vraiment à ça ? Vous stockez vos nœuds enfants dans un tableau, mais ils sont enveloppés dans un seul objet. {} . Vous avez spécifié deux title et deux attributs children par exemple, comme enfants de "topNode".

0voto

Ali80 Points 146

J'en ai écrit un autre en fonction de mes besoins

  1. est injecté.
  2. le chemin de la branche trouvée est disponible
  3. le chemin actuel pourrait être utilisé dans une déclaration de condition
  4. pourrait être utilisé pour faire correspondre les éléments de l'arbre à un autre objet

    // if predicate returns true, the search is stopped function traverse2(tree, predicate, path = "") { if (predicate(tree, path)) return true; for (const branch of tree.children ?? []) if (traverse(branch, predicate, ${path ? path + "/" : ""}${branch.name})) return true; }

exemple

let tree = {
  name: "schools",
  children: [
    {
      name: "farzanegan",
      children: [
        {
          name: "classes",
          children: [
            { name: "level1", children: [{ name: "A" }, { name: "B" }] },
            { name: "level2", children: [{ name: "C" }, { name: "D" }] },
          ],
        },
      ],
    },
    { name: "dastgheib", children: [{ name: "E" }, { name: "F" }] },
  ],
};

traverse(tree, (branch, path) => {
  console.log("searching ", path);
  if (branch.name === "C") {
    console.log("found ", branch);
    return true;
  }
});

sortie

searching  
searching  farzanegan
searching  farzanegan/classes
searching  farzanegan/classes/level1
searching  farzanegan/classes/level1/A
searching  farzanegan/classes/level1/B
searching  farzanegan/classes/level2
searching  farzanegan/classes/level2/C
found  { name: 'C' }

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