2015-01-26 5 views
0

У меня есть древовидная структура JSon объектаДерево рекурсии: Как получить родительский корень выбранного узла дерева

{ 
    "saxena": { 
    "chewning": { 
     "betten": {}, 
     "ching": {}, 
     "kelley": {} 
    }, 
    "kobrinsky": { 
     "karniely": {}, 
     "naveh": {}, 
     "rozenfeld": {}, 
     "shalom": {} 
    }, 
    "schriever": { 
     "brinker": {}, 
     "mcleland": {}, 
     "merrick": {} 
    }, 
    "vacant": { 
     "akers": {}, 
     "carlton": { 
     "marvin": {} 
     }, 
     "fox": { 
     "glover": { 
      "clements": {}, 
      "koya": {} 
     }, 
     "holden": {} 
     } 
    } 
    }, 
    "bill": { 
    "phil": { 
     "bob": {}, 
     "smith": {}, 
     "hello": {} 
    }, 
    "bye": { 
     "ok": {}, 
     "hmm": {}, 
     "no": {}, 
     "alright": {} 
    } 
    } 
} 

Имена корня Саксен и клюв. Я хотел бы создать функцию, которая может определить корневое имя пользователя, которого он ищет.

Для самого простого случая, если они ищут saxena, он возвращает saxena. Если они возвращают счет, он возвращает счет.

Для более сложного случая saxena будет возвращена, если пользователь будет искать любое из имен под ней.

Например, если я искал betten, akers, glovers или koya, saxena будет возвращен.

И если я ищу боб, кузнец или хорошо, счет будет возвращен.

Это моя работа. Я попытался использовать рекурсию, но по какой-то причине, когда я нахожу выбранное имя, я возвращаю неопределенный.

var findRootName = function(data, ltmName) { 
    for (var key in data) { 
     if (key == ltmName) { 
      return key; 
     } else { 
      findNode(data[key], ltmName); 
     } 
    } 
} 

var findNode = function(data, ltmName) { 
    for (var key in data) { 
     if (key == ltmName) { 
      return key; 
     } else { 
      findNode(data[key], ltmName); 
     } 
    } 
} 

http://jsfiddle.net/gthnfta7/7/

Может кто-нибудь мне помочь и понять, почему моя рекурсивная функция не работает?

+0

Пожалуйста, вставьте JavaScript для вашего вопроса непосредственно в свой вопрос. Внешние ссылки как единственная ссылка на ваш код здесь не разрешены в StackOverflow, потому что у них есть привычка исчезать или меняться со временем, что затем делает вопрос бесполезным для будущих читателей, а Stackoverflow хочет быть важной ссылкой на информацию не только для Оригинальный человек задает вопрос, но и для многих людей, которые приходят после. – jfriend00

+0

Вы должны сделать это ЭТО время или ваш вопрос может быть закрыт. Используйте ссылку «Изменить», чтобы изменить свой вопрос и вставить соответствующий код в вопрос. – jfriend00

+1

Гораздо лучше. Теперь ваш вопрос имеет более продолжительную полезность. – jfriend00

ответ

1

Проблема в том, что вы ничего не возвращаете в случае обнаружения узла. Вы можете упростить вашу функцию, написав это так:

var findParent = function(data, childName) { 
    for (var key in data) { 
     if (key === childName || findParent(data[key], childName)) { 
     return key; 
     } 
    } 
}; 
2

Альтернативный метод, если вам нужно сделать много звонков через одних и тех же данных, что-то вроде следующего:

function makeSearcher(data) { 
    var paths = (function makePaths(data, parentPath, store) { 
     var path = parentPath || []; 
     results = store || {}; 
     Object.keys(data).forEach(function(key) { 
      var newPaths = path.concat(key); 
      results[key] = newPaths; 
      makePaths(data[key], newPaths, results); 
     }); 
     return results; 
    })(data); 
    return function(key) { 
     var path = paths[key]; 
     return path && path[0]; 
    }; 
} 

var search = makeSearcher(data); 

search('clements'); //=> 'savena' 

Обратите внимание, что внутренняя makePaths функция шире, чем использование здесь, так как она может быть также использовать для возврата результата как

[ "saxena", "vacant", "fox", "glover", "clements" ] 
Смежные вопросы