我是否真的必须为这个递归函数使用全局变量?

时间:2017-08-27 00:35:20

标签: javascript recursion

我有一个恰好是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"]);
        }
    }
}

似乎我无法通过有意义的退货声明处理所有可能性。例如,如果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

2 个答案:

答案 0 :(得分: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变量,从而导致不稳定的行为。

答案 1 :(得分: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,因此结果为undefined或{{1} }}或array意味着在成员中,如果未找到whatever,则匹配该组。