2017-09-27 170 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);