我在工厂写了以下函数,以后可以使用它:
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);
答案 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)
}
}