无法使这个(简单)递归函数返回一个值

时间:2014-10-20 20:00:44

标签: javascript angularjs

我在工厂写了以下函数,以后可以使用它:

treeView.factory('utils', function () {
    return{
        // Util for finding an object by its 'id' property among an array
        findById:function findById(a, targetId) 
        {
          var indexResult = 0;
          for (var i = 0; i < a.length; i++) 
          {
                //console.log(targetId + " - " +a[i].id);

                if (a[i].id === targetId)
                {

                    indexResult = i+1;  
                    console.log(a[indexResult-1]);
                    break;
                }
                else  
                {
                    if(a[i].nodes instanceof Array)
                    {
                        return findById(a[i].nodes, targetId);
                    }
                }
          }
          if(indexResult == 0)
          {

          }
          else
          {
            return a[indexResult-1]; 
          }

        }
    };

});

然后在我的控制器中我称之为:

$scope.elementToEdit = utils.findById($scope.data,$stateParams.elementId);
console.log($scope.elementToEdit)

和我的控制台记录&#34;找到&#34;但回报是&#34;未定义&#34;!

我是否以错误的方式致电工厂?它看起来并不是这样,因为我是在角度以外写的,它是一样的。或者为时已晚,我看不到明显的?

编辑:实际上这个问题与angular无关。我的数据集不是一个简单的数组,而是一个数组数组,每个数组都包含它的子数。我相信该功能不能正常工作,因为即使函数找到正确的元素,它仍继续在相同深度的其他数组上运行。我可以使用全局变量来完成这个技巧。但这不是另一种方式吗?

在这里找到小提琴 http://jsfiddle.net/Morgorth/7njyuzxc/

最终编辑:我的错误是在JS中当你做一个递归函数时,你必须像这样返回它: return findById(a [i] .nodes,targetId);

2 个答案:

答案 0 :(得分:1)

您无法在循环中使用return。使用break退出循环,然后立即返回

var ii = 0;
for (var i = 0; i < a.length; i++) {
  //console.log(targetId + " - " +a[i].id);

  if (a[i].id === targetId) {
    console.log("found");
    ii = i + 1;
    break;
  } else {
    if (a[i].nodes instanceof Array) {
      findById(a[i].nodes, targetId);
    }
  }
}
if(ii == 0)
  return 1;
else
  return a[ii - 1];

答案 1 :(得分:0)

我的错误是在javascript中,当你执行递归函数时,你必须调用它来返回,如下所示:

function findbyid($array)
{
    //whatever code

    if(//conditon)
    {
    return findbyid($array)
    }

}