2014-10-20 3 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 (а [I] .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

+0

@ Eagle1 Вы изменили свой код, чтобы он выглядел как мой? Код, который я опубликовал, должен работать из коробки :) – DividedByZero

+0

да, я посмотрел на него, все одно и то же, но имя переменной – Eagle1

Смежные вопросы