2014-02-14 74 views
0

我做了一個函數以便在樹對象中查找元素。我的函數可以工作,但有時函數在查看所有樹之前沒有找到值並停下來。Javascript在遞歸數組中找到值

我無法解釋它爲什麼有時會有效,有時不會。

這裏是我的小提琴:http://jsfiddle.net/3cdwA/2/

當你點擊類別,如「科學」你可以看到,它的工作原理。但是,如果你點擊「Bandes-Dessinées」,它應該顯示「漫畫」,但它不會。

這裏是我的遞歸函數:

function getChildrenFromCurrentFolder(tree, targetFolder) { 
console.log(tree); 
// Find recursivly all direct children of targeted folder 
if (targetFolder == tree.id) { 
    return tree.folders; 
} else if (tree.folders.length > 0) { 
    var folders = []; 
    for (i = 0; folders.length == 0 && i < tree.folders.length; i++) { 
     folders = getChildrenFromCurrentFolder(tree.folders[i], targetFolder); 
    } 
    return folders; 
} 
return []; 

}

這裏是我的測試樹:

tree = { 
    'id': 1, 
    'name': 'Mes Bookmarks', 
    'folders': [ 
     { 
     'id': 2, 
     'name': 'Sciences', 
     'folders': [ 
      { 
       'id': 3, 
       'name': 'Biologie', 
       'folders': [ 
        { 
         'id': 12, 
         'name': 'Neurologie', 
         'folders': [] 
        } 
       ] 
      }, 
      { 
       'id': 4, 
       'name': 'Astrophysique', 
       'folders': [ 
        { 
         'id': 8, 
         'name': 'Cosmologie', 
         'folders': [ 
         { 
          'id': 10, 
          'name': 'Système solaire', 
          'folders': [] 
         } 
         ] 
        }, 
        { 
         'id': 9, 
         'name': 'Trous noirs', 
         'folders': [] 
        } 
       ] 
      }, 
      { 
       'id': 5, 
       'name': 'Mathématiques', 
       'folders': [] 
      } 
     ] 
     }, 
     { 
     'id': 6, 
     'name': 'Actualités', 
     'folders': [ 
      { 
       'id': 11, 
       'name': 'Monde', 
       'folders': [] 
      } 
     ] 
     }, 
     { 
     'id': 7, 
     'name': 'Bandes-dessinées', 
     'folders': [ 
      { 
       'id': 13, 
       'name': 'Comics', 
       'folders': [] 
      } 
     ] 
     } 
    ] 
}; 

回答

1

這是一個簡單而常見的錯誤。你忘了申報你的循環變量,這樣做遞歸時,你正在創建一個真實被重用的Global的麻煩:

function displayFolders() { 
    ... 
     for (var i = folders.length-1; i >= 0; i--) 
    ... --^-- 
} 

function getChildrenFromCurrentFolder(tree, targetFolder) { 
    ... 
     for (var i = 0; folders.length == 0 && i < tree.folders.length; i++) { 
    ... --^-- 
} 

function getBreadcrumb(tree, targetFolder, breadcrumb) { 
    ... 
    for (var i = 0; i < tree['folders'].length; i++) 
    ... --^-- 
} 

我不知道其他所有的邏輯是正確的,但這絕對更改行爲。

http://jsfiddle.net/3cdwA/4/

+0

絕對!非常感謝。 – KmeCnin

+0

:)有工具可以防止這些問題。嘗試使用http://www.jshint.com/並使用'「use strict」',它會引發錯誤。 – elclanrs