我得到了以下的功能,我在工廠裏寫,所以我也可以在以後使用它:不能讓這個(簡單)遞歸函數返回一個值
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);
非常感謝我不知道這一點。我更新了我的代碼:儘管成功記錄在控制檯中,但我仍然只獲得1。這不是我的夜晚。 – Eagle1 2014-10-20 21:23:44
@ Eagle1你修改了你的代碼看起來像我的嗎?我發佈的代碼應該可以開箱即用:) – DividedByZero 2014-10-20 21:35:00
是的,我做了,看看它,一切都一樣,但變量名稱 – Eagle1 2014-10-21 07:09:50