2017-09-20 5 views
-2

J'ai un fichier JSON comme celui-ci:Javascript, trouver les parents de l'objet dans un JSON

{ 
    "id": 1, 
    "name": "node", 
    "nodes": [ 
     { 
     "id": 2, 
     "name": "node", 
     "nodes": [ 
      { 
      "id": 3, 
      "name": "node", 
      "nodes": [] 
      } 
     ] 
     }, 

Je voudrais avoir une fonction où je passe « id » de l'objet et je peux obtenir une liste de toutes les propriétés "id" du nœud parent. Je suppose que je pose une question sur une fonction récursive qui fonctionne d'une manière pour obtenir l'id désiré et ensuite remonter l'arbre et pousser toutes les valeurs "id" pour chaque parent (comment, je ne sais pas). Est-ce possible en JavaScript/Lodash?

+0

merci pour les réponses les gens, je l'ai en cours d'exécution en utilisant Lodash selon exampel de marvel308 https://plnkr.co/edit/Qsm4sZigqZwYW7MRNuti?p=preview – user841760

Répondre

1

vous pouvez le faire de la manière

let obj = { 
 
    "id": 1, 
 
    "name": "node", 
 
    "nodes": [ 
 
     { 
 
     "id": 2, 
 
     "name": "node", 
 
     "nodes": [ 
 
      { 
 
      "id": 3, 
 
      "name": "node", 
 
      "nodes": [] 
 
      } 
 
     ] 
 
     } 
 
    ] 
 
} 
 
//console.log(obj); 
 

 
function find(obj, id){ 
 
    if(obj.id == id){ 
 
     return [id]; 
 
    } 
 
    let result = []; 
 
    for(element of obj.nodes){ 
 
     //console.log('p', obj.id, 'c', element); 
 
     result = result.concat(find(element, id)); 
 
    } 
 
    //console.log(result); 
 
    if(result.length > 0){ 
 
     result.push(obj.id); 
 
    } 
 
    return result; 
 
} 
 

 
console.log(find(obj, 3));

+0

merci, cela semble fonctionner. Et si je voulais utiliser un tableau d'objets? – user841760

+0

vous voyez comment j'ai appelé les tableaux internes en utilisant un for..of boucle, vous pouvez simplement l'appeler de la même manière dans la fonction extérieure – marvel308

+0

gotcha, merci pour l'aide! – user841760

0

suivant, je suppose que je pose sur une fonction récursive qui fonctionne d'une façon d'obtenir le choix « id » et puis remonte l'arbre et repousse toutes les valeurs "id" pour chaque parent (comment, je ne sais pas)

droite. Assez compliqué, vous ne pensez pas?

pourquoi ne pas vous mật ce genre de choses:

var data = { 
 
    "id": 1, 
 
    "name": "node", 
 
    "nodes": [{ 
 
    "id": 2, 
 
    "name": "node", 
 
    "nodes": [{ 
 
     "id": 3, 
 
     "name": "node", 
 
     "nodes": [] 
 
    }] 
 
    }] 
 
} 
 

 
var nodesById = Object.create(null); 
 
//quickly indexing the nodes, 
 
//and adding them a reference to their parentId 
 
(function _(parentId, node){ 
 
    node.parentId = parentId; 
 
    nodesById[node.id] = node; 
 
    if(node.nodes) 
 
    node.nodes.reduce(_, node.id); 
 
    
 
    return parentId; //for the reduce() 
 
})(null, data); 
 

 
function getParent(node){ 
 
    return nodesById[node.parentId]; 
 
}

Maintenant trouver un noeud est une question d'un simple recherche dans cette carte.