2017-08-27 34 views
0

我有恰好是一個for循環我真的不得不爲這個遞歸函數使用全局變量嗎?

function deepFindGroup(groupName, currentGroup) { 
    console.log("Testing"); 
    for (e in currentGroup) { 

     if (currentGroup[e].intName == groupName) { 
      console.log(currentGroup[e]["Members"]); 
      return currentGroup[e]["Members"]; 
     } else if (currentGroup[e]["Members"]) { 
      return deepFindGroup(groupName, currentGroup[e]["Members"]); 
     } 
    } 
} 

看來我不能處理一個有意義的return語句每一種可能性遞歸函數。例如,如果currentGroup [e] .intName不等於groupName,並且該分支的子節點沒有成員屬性(在這種情況下,它根本沒有任何子節點)。它最終返回undefined。我能想到的唯一解決方案是製作一個全局變量,我試圖避免這一點。

編輯: 該函數應該返回樹中給定的分支。該樹由包含「成員」的對象(具有intName屬性)組成,其本身可以是包含其他成員的對象。成員也可以包含任何內容,但仍然有一個intName。

貌似是:

Gengroup_1--intName: Gengroup_1 
      | 
      --Members-- nochild -- intName: nochild 
        | 
        --Gengroup_2--intName: Gengroup2 
           | 
           --Members-- object -- intName: object 
              | 
              -- anotherObject -- intName: anotherObject 
+0

應該做的功能是什麼? – Ryan

+0

返回樹中給定分支的位置 –

+1

請更具體一點。無論如何,您可能需要一個值來表示沒有發現任何東西(例如'null')並在從子查找返回之前檢查該值。 – Ryan

回答

1

定義result進入該功能時,停止迭代,當事情被發現:

function deepFindGroup(groupName, currentGroup) { 
 
    var result = null; 
 

 
    for (e in currentGroup) { 
 
    if (currentGroup[e].intName === groupName) { 
 
     result = currentGroup[e]["Members"]; 
 
    } else if (currentGroup[e]["Members"]) { 
 
     result = deepFindGroup(groupName, currentGroup[e]["Members"]); 
 
    } 
 
    
 
    if (result || result === undefined) break; 
 
    } 
 
    
 
    return result; 
 
} 
 

 
var group = { 
 
    one: { 
 
    intName: 'one', 
 
    Members: { 
 
     one_one: { 
 
     intName: 'one_one', 
 
     } 
 
    } 
 
    }, 
 
    two: { 
 
    intName: 'two', 
 
    Members: { 
 
     two_one: { 
 
     intName: 'two_one', 
 
     Members: {} 
 
     } 
 
    } 
 
    } 
 
} 
 

 
console.log(deepFindGroup('one', group)) // -> {one_one: {intName: 'one_one'}} 
 
console.log(deepFindGroup('one_one', group)) // -> undefined (members are undefined) 
 
console.log(deepFindGroup('two_one', group)) // -> {} 
 
console.log(deepFindGroup('two_two', group)) // -> null

請記住,當一個匹配的組currentGroup[e]["Members"]undefined,你會得到undefined因此如果結果爲undefinedarraywhatever意味着在成員中,那麼該組是匹配的,如果null它不是找到。

1

您的功能不會嘗試多個分支,如果一個分支沒有得到發現。即使沒有找到匹配,它也會返回。相反,它應該允許for循環繼續,以便可以通過另一個分支完成新的搜索。

這裏是你如何能做到這一點,假設發現值永遠不會undefined本身:

function deepFindGroup(groupName, currentGroup) { 
    var result; 
    console.log("Testing"); 
    for (var e in currentGroup) { 
     if (currentGroup[e].intName == groupName) { 
      console.log(currentGroup[e]["Members"]); 
      return currentGroup[e]["Members"]; 
     } else if (currentGroup[e]["Members"]) { 
      // Don't return before you have looked at the result: 
      result = deepFindGroup(groupName, currentGroup[e]["Members"]); 
      if (result !== undefined) return result; 
     } 
    } 
} 

另外,還要確保你的變量聲明。你沒有聲明e,所以它是全局的,所以函數作用域的不同遞歸實例將改變相同的e變量,導致不穩定的行爲。

+0

感謝e,我不知道。有沒有可以證實這一點的官方消息? –

+0

@DominicGrenier這是一個非常有名的JS特性:如果你不使用var關鍵字,它將在全局範圍內聲明。正如你所要求的* oficial *源代碼,這裏是:https://www.ecma-international.org/ecma-262/ –

+0

沒有比ECMAScript的文檔更官方。 https://www.ecma-international.org/ecma-262/#sec-iteration-statements –

相關問題