2017-06-18 52 views
-1

我有一個遞歸方法,它將一個鍵作爲輸入並遍歷一個對象數組以獲取該鍵的值。Typescript/Javascript:獲取鍵值的遞歸方法

findKeyFun(passedKey: string): string { 
    let tempVal = null; 
    for(let i=0; i< this.valueArray.length; i++) { 
     if(this.valueArray[i].children) { 
     for(let j=0; j< this.valueArray[i].children.length; j++) { 
      if(this.valueArray[i].children[j].children) { 
      for(let k=0; k<this.valueArray[i].children[j].children.length; k++){ 
       if(this.valueArray[i].children[j].children[k].key==passedKey){ 
       tempVal = this.valueArray[i].children[j].children[k].value; 
       return tempVal; 
       } 
      } 
      } 
     } 
     } 
    } 
    return tempVal; 
    } 

Plunker

但是有很多for迴路參與這段代碼。無論密鑰的位置如何,我怎樣才能製作這種遞歸方法?

+1

你的代碼有點難以遵循。你的數據的結構是什麼? – aeid

+0

@aeid這是一個對象數組,每個對象可能有也可能沒有子/孫子 – Protagonist

+0

遞歸會發現,但'array.reduce'好得多我認爲 – aeid

回答

0

我爲你創建了一個小樣本。

容器類可能類似於您正在使用的數據結構。它有一把鑰匙和一批兒童。

您在問題中使用的算法非常成問題。它只搜索初始對象的孩子的孩子的鑰匙。如果初始對象具有正確的鍵,它仍然可以返回null。

我已經爲您執行了深度優先搜索。 這應該在層次結構中的任何位置返回正確的孩子。

class Container{ 
    key: string; 
    children: Container[]; 
} 

function searchKey(container: Container, key:string){ 
    if (container.key == key) { 
     return container; 
    } 
    else if (container.children.length>0){ 
     for (var child of container.children) { 
      var found = searchKey(child, key); 
      if (found != null) { 
       return found 
      } 
     } 
    } 
    return null 
} 

我建議你閱讀這種類型的算法。

這是一個不錯的wikipedia文章。

+0

這適用於對象數組({[]})。但是,如果輸入是一個對象數組([{}]),如何處理它?例如 - function searchKey(container:Container [],key:string){} – Protagonist