2017-09-27 121 views
0

感谢您提前帮忙。能否请你帮我看看,我在此代码做了错误:递归JS问题

<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的),是一家集通过父ID的儿童递归方法(通过调用的getChildren(parentId的) )然后它为每个孩子递归地调用自己以收集孩子的孩子等等。我期望从returnValue获得的输出是:

自parentId“1”以来有2个元素的数组有2个子元素“2”和“3”。然后“2”将有1个元素“4”的子阵列,并且“3”将具有2个元素“5”和“6”的子阵列。但是,我得到这个和每个subchild有2个孩子等endlessely,请帮我找出错误代码:

incorrect output

+0

当您在稍后尝试使用的函数中设置某些内容时,我会使用let itemData = new Object();'。在所有的执行之后,itemData可能会被设置为最后执行的任务。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let有关于let的信息。 –

+0

returnValue = []; <---全球 – epascarello

回答

1

请参见下面的变化。我已添加let并将var更改为let。看起来你遇到了一个被称为Temporal Dead Zone的问题(如Mozilla所述)

有关它的更多信息可以在这里找到。 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

非常感谢John,这解决了我的问题 –

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 []; 
    } 
} 

IMO还存在一些问题,与此有关。 getChrildrenRecursively并不真的让孩子,但建立一棵树。通过一次调整,它将包括根:

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