2013-09-25 3 views
-1

Так что я не супер опытный с рекурсивными функциями, но в идеале эта функция будет искать объект произвольной глубины для конкретного ребенка и возвращать его, но по какой-то причине, когда я return r;, я получаю r = undefined.Рекурсивный поиск

http://jsfiddle.net/RRyRQ/

function search(_for, _in) { 
    var r; 
    for (var p in _in) { 

     // is a match 
     if (p == _for) { 
      console.log("MATCH"); 
      r = _in[_for]; 
      break; 
     } 

     // if not a match but has children 
     if (p != _for && nodeCount(_in[p]) > 0 && r == false) { 
      console.log("RECURSE INTO " + p); 
      r = search(_for, _in[p]); 
     } 

    } 
    return r; 
} 

Спасибо.

ответ

4

Нет причин подсчитывать количество узлов, если это объект, вы можете предположить, что цикл необходим - сохраните сами циклы.

Вот упрощенная версия:

function search(_for, _in) { 
    var r; 
    for (var p in _in) { 
     if (p === _for) { 
      return _in[p]; 
     } 
     if (typeof _in[p] === 'object') { 
      if ((r = search(_for, _in[p])) !== null) { 
       return r; 
      } 
     } 
    } 
    return null; 
} 

Там будет проблемой, если значение объекта, который находится в null, также, если вы должны были использовать false или 0 или -1 аналогичным образом. Возможно, лучше всего просто построить и вернуть путь к объекту; таким образом вы имеете дело только с массивом строк, который позволит более безопасное сравнение.

Обновленной рабочая скрипка: http://jsfiddle.net/RRyRQ/3/

+0

Это делает так много смысла! –

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