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