2017-09-27 2 views
0

Merci de nous aider à l'avance. Pouvez-vous s'il vous plaît me aider à trouver l'erreur que je fais dans ce code:récursive JS question

<script> 
 
    function getChildrenRecursively(parent) { 
 
    returnValue = []; 
 
    var children = getChildren(parent); 
 
    children.forEach(function(child, index, array) { 
 
     itemData = new Object(); 
 
     itemData.id = parent + "_" + index + "_" + child; 
 
     itemData.items = getChildrenRecursively(child); 
 

 
     returnValue.push(itemData); 
 
    }) 
 
    return returnValue; 
 
    } 
 

 
    function getChildren(parentId) { 
 
    if (parentId == 1) return [2, 3]; 
 
    if (parentId == 2) return [4]; 
 
    if (parentId == 3) return [5, 6]; 
 
    if (parentId == 4) return []; 
 
    if (parentId == 5) return []; 
 
    if (parentId == 6) return []; 
 
    } 
 

 
    console.log(getChildrenRecursively(1)); 
 
</script>

getChildrenRecursively (parentId) est une méthode récursive qui rassemble les enfants de id parent passé (en appelant getChildren (parentId)) et ensuite il se récurrente pour chaque enfant de rassembler des enfants d'enfants et ainsi de suite. La sortie que j'attends de returnValue est la suivante:

Un tableau avec 2 éléments depuis parentId « 1 » a 2 enfants « 2 » et « 3 ». Alors "2" aura un sous-tableau de 1 élément "4" et "3" aura un sous-tableau de 2 éléments "5" et "6". Mais j'obtenir cela et chaque subchild a 2 enfants et ainsi de suite endlessely, s'il vous plaît me aider à comprendre le bug dans le code:

incorrect output

+0

Lorsque vous définissez quelque chose dans une fonction que vous essayez d'utiliser plus tard, j'utiliser 'let itemData = new Object();'. Après toutes les exécutions, itemData sera probablement défini sur la dernière exécution exécutée. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let contient des informations sur let. –

+0

returnValue = []; <--- global – epascarello

Répondre

1

Voir les modifications ci-dessous. J'ai ajouté let et changé var-let. Il semble que vous ayez rencontré un problème connu sous le nom de Zone morte temporelle (tel que décrit par Mozilla)

Plus d'informations à ce sujet peuvent être trouvées ici. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let

<script> 
 
    function getChildrenRecursively(parent) { 
 
    let returnValue = []; 
 
    let children = getChildren(parent); 
 
    children.forEach(function(child, index, array) { 
 
     let itemData = new Object(); 
 
     itemData.id = parent + "_" + index + "_" + child; 
 
     itemData.items = getChildrenRecursively(child); 
 

 
     returnValue.push(itemData); 
 
    }) 
 
    return returnValue; 
 
    } 
 

 
    function getChildren(parentId) { 
 
    if (parentId == 1) return [2, 3]; 
 
    if (parentId == 2) return [4]; 
 
    if (parentId == 3) return [5, 6]; 
 
    if (parentId == 4) return []; 
 
    if (parentId == 5) return []; 
 
    if (parentId == 6) return []; 
 
    } 
 

 
    console.log(getChildrenRecursively(1)); 
 
</script>

+0

Merci beaucoup John, cela a résolu mon problème –

0
function getChildrenRecursively(parent) { 
    const children = getChildren(parent); 
    const arrReturn = children.map(
     (child, index) => ({ 
      id: parent + "_" + index + "_" + child, 
      items: getChildrenRecursively(child), 
     })); 
    return arrReturn;  
} 

function getChildren(parentId) { 
    switch (parentId) { 
    case 1: return [2, 3]; 
    case 2: return [4]; 
    case 3: return [5, 6]; 
    default: return []; 
    } 
} 

OMI il y a encore quelques problèmes avec cela. getChrildrenRecursively n'a pas vraiment d'enfants, mais construit un arbre. Avec un ajustement, il inclurait la racine:

function getTree(parent) { 
    function createNode(id, index = 0) { 
     return { 
      id: parent + "_" + index + "_" + id, 
      items: getChildren(id).map(createNode); 
     }; 
    } 
    return createNode(parent); 
} 
console.log(getTree(1).items);