2014-10-20 94 views
0

我得到了以下的功能,我在工厂里写,所以我也可以在以后使用它:不能让这个(简单)递归函数返回一个值

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) 

和我的控制台日志“找到”,但返回是“未定义”!

我是否错误地称工厂?这似乎并不是因为我把它写在角度之外,而且它是一样的。或者是为时已晚,我看不到明显的?

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

发现这里的小提琴 http://jsfiddle.net/Morgorth/7njyuzxc/

最后编辑:我的错误是,在JS当你做你有这样的回报称之为递归函数:返回 findById(A [1] .nodes ,targetId);

回答

0

我的错误后立即回到这里是在Javascript中当你做,你必须把它返回,这样的递归函数:

function findbyid($array) 
{ 
    //whatever code 

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

} 
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]; 
+0

非常感谢我不知道这一点。我更新了我的代码:尽管成功记录在控制台中,但我仍然只获得1。这不是我的夜晚。 – Eagle1 2014-10-20 21:23:44

+0

@ Eagle1你修改了你的代码看起来像我的吗?我发布的代码应该可以开箱即用:) – DividedByZero 2014-10-20 21:35:00

+0

是的,我做了,看看它,一切都一样,但变量名称 – Eagle1 2014-10-21 07:09:50