2016-09-22 3 views
0

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

function getDescendants(id, descendants){ 
    children = getChildren(id); 
    if(children){ 
     for (var child in children) { 
      if(children.hasOwnProperty(child)){ 
       descendants.push(getDescendants(children[child].id, descendants)); 
      } 
     } 
    } 
    return getPersonById(id); 
} 

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

GetChildren возвращается и массив дочерних объектов getPersonById возвращает лицо, объект

Любая помощь/предложения приветствуются

+1

кода не логично, почему бы не вернуть 'descendants' непосредственно –

+0

@AbdelrhmanMohamed Ok представить себе потомок даже не прошел в себе его глобальный ... если вместо этого мы делаем это в цикле 'для (var child у детей) { if (children.hasOwnProperty (ребенок)) { descendants.push (дети [ребенок]); getDescendants (дети [child] .id); } \t \t} ' – HobbitMafia

+0

Позвольте мне понять это, вам нужно помнить, что исходный массив возвращался в первый раз, когда вызывается' getChildren'? вы пытаетесь сделать b-дерево случайно? – Ryan

ответ

0
function getDescendants(id, descendants, originalChildren){ 
    children = getChildren(id); 
    if(children){ 
     var originalChildren = originalChildren || children; 
     for (var child in children) { 
      if(children.hasOwnProperty(child)){ 
       descendants.push(getDescendants(children[child].id, descendants, originalChildren)); 
      } 
     } 
    } 
    return getPersonById(id); 
} 

Когда вы первый звонок getDescendants проход null или просто что-нибудь в не пройдет третий слот. Если он равен нулю, он будет хранить значение children в переменной, иначе он будет хранить originalChildren каждый раз, и вы будете продолжать передавать этот первый экземпляр children через вашу функцию.

0

После консультации с некоторыми сотрудниками и большой головной боли, это то, с чем мы столкнулись.

let getDescendants = (parentID, people) => { 
    return people.filter((el)=>{ 
     return el.parents.indexOf(parentID) > -1; 
    }).map((kid)=>{ 
     return [...getDescendants(kid.id, people), kid.id ]; 
    }).reduce((a, b) => { 
     return a.concat(b); 
    }, []); 
} 

Спасибо всем за помощь

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