2017-10-18 21 views
1

Je suis en train de boucler sur un arbre et il articles afin de rechercher un noeud par son id, voici le code:mal à essayer de boucler un arbre récursive

<!DOCTYPE html> 
<meta charset="utf-8"> 
<html> 
<head> 
    <title>Hi there</title> 
    <script> 
    function getNode(node, id) { 
     if (node.id === id) { 
     return node; 
     } 
     if (node.items) { 
     for (let x of node.items) { 
      return getNode(x, id); 
     } 
     } 
    } 

    function load() { 
     var nodes = [{ 
     id: 0, 
     label: 'root', 
     items: [{ 
      id: 1, 
      label: 'one' 
     }, { 
      id: 2, 
      label: 'two' 
     }, { 
      id: 3, 
      label: 'three' 
     }, { 
      id: 4, 
      label: 'four' 
     }] 
     }]; 
     var n = nodes[0]; 
     var node = getNode(n, 3); 
     console.log(node); 
    } 

    window.onload = load(); 
    </script> 
</head> 
<body> 
</body> 
</html> 

Je suis face à la problème lorsque j'appelle load la fonction récursive renvoie undefined. Un indice sur la façon de résoudre ce problème?

+0

Bienvenue dans StackOverflow. Veuillez lire et suivre les consignes de publication dans la documentation d'aide. [Exemple minimal, complet, vérifiable] (http://stackoverflow.com/help/mcve) s'applique ici. Nous ne pouvons pas vous aider efficacement tant que vous n'afficherez pas votre code MCVE et que vous ne décrivez pas précisément le problème. Nous devrions pouvoir coller votre code posté dans un fichier texte et reproduire le problème que vous avez décrit. – Prune

Répondre

5
for (let x of node.items) { 
    return getNode(x, id); 
} 

Ceci examinera le tout premier élément, et indépendamment de ce qu'il trouve, il renvoie le résultat de getNode. Donc, il descend à l'élément avec id = 1, puis retourne indéfini, et continue à retourner indéfini sauvegarder la pile. Il ne passe jamais au reste des éléments (c'est-à-dire que la boucle ne fait rien). À la place, il devrait retourner seulement s'il l'a trouvé, ou passer à l'élément suivant.

function getNode(node, id) { 
 
    if (node.id === id) { 
 
    return node; 
 
    } 
 
    if (node.items) { 
 
    for (let x of node.items) { 
 
     var result = getNode(x, id); 
 
     if (result) { 
 
     return result; //<<---- only returning if we found it 
 
     } 
 
    } 
 
    } 
 
} 
 

 
function load() { 
 
    var nodes = [{ 
 
    id: 0, 
 
    label: 'root', 
 
    items: [{ 
 
     id: 1, 
 
     label: 'one' 
 
    }, { 
 
     id: 2, 
 
     label: 'two' 
 
    }, { 
 
     id: 3, 
 
     label: 'three' 
 
    }, { 
 
     id: 4, 
 
     label: 'four' 
 
    }] 
 
    }]; 
 

 
    var n = nodes[0]; 
 

 
    var node = getNode(n, 3); 
 
    console.log(node); 
 
} 
 

 
load();

+0

c'était un succès! merci ... dans cinq minutes je vais le marquer comme la solution! –

-2

Vous ne pouvez pas faire récursive sur ce parce qu'il n'y a pas de propriété des objets « articles » [0], de sorte que la récursion arrête quand il vient à

{ 
    id: 1, 
    label: "one" 
} 

et retour indéfini.

+0

qui n'est pas correct –

+0

jetez un oeil au code fixe, copiez-le et exécutez-le, cela fonctionne. – assembler

+0

Je veux dire, par votre code, ça s'arrête ici – Keming