2017-08-27 35 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 –

相关问题