2014-10-20 66 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