Comment ajouter un objet à un objet javascript imbriqué à l'aide d'un ID parent

Dans ma demande, je crée un objet JavaScript en fonction d'une réponse JSON du serveur similaire à celle-ci:

{ name: "root", id: 1, children: [ { name: "child one", id: 11, children: [ {name: "grand child 1", id: 111, children: []}, {name: "grand child 2", id: 112, children: []} ] }, { name: "child two", id: 12, children: [] } ] } 

Je crée un nouveau nœud tel que:

  {name: "grandchild three", id: 113, children:[]} 

Dans cet esprit, comment puis-je ajouter ce nouveau petit-fils à son parent avec l'ID 11? Notez que je ne connais pas le chemin statique du noeud avec id == 11 alors je me demande comment je pourrais obtenir ce noeud simplement en sachant qu'il est id .

Modifier: notez que les ID dans le cas réel ne codent pas le chemin d'accès aux objets. J'ai créé cet exemple simple pour la démonstration de la structure de données dont je suis confronté. Mais je ne peux pas récupérer le chemin d'accès à l'objet en utilisant son identifiant dans ma véritable application.

Voir ce violon: http://jsfiddle.net/2Dvws/

Il trouvera un objet par ID. Et pousser le nouvel enfant. Étant donné que chaque objet dans JavaScript est une référence, vous pouvez le renvoyer en tant que var.

 var ob = { name: "root", id: 1, children: [ { name: "child one", id: 11, children: [ { name: "grand child 1", id: 111, children: []}, { name: "grand child 2", id: 112, children: []} ]}, { name: "child two", id: 12, children: []} ] }; 

La fonction qui renverra l'élément trouvé. Examinera tous les éléments d'enfant.

 function findObjectById(root, id) { if (root.children) { for (var k in root.children) { if (root.children[k].id == id) { return root.children[k]; } else if (root.children.length) { return findObjectById(root.children[k], id); } } } }; var bla = findObjectById(ob, 111); console.log(bla); bla.children.push({ name: "child x", id: 1111, children: [] }); console.log(ob); 

La sortie est que l'enfant avec id 111 aura 1 enfant avec ID 1111

Je suppose que l'ID se compose du parent-id plus l'index (1 à 9) dans le tableau des enfants? Ensuite, vous pouvez aller comme ça:

 var rootobj = {…}; var newnode = {name: "grandchild three", id: 113, children:[]}; var id = ""+newnode.id; var cur = [rootobj]; for (var i=0; i<id.length-i; i++) cur = cur[id.charAt(i)-1].children; cur[id.charAt(i)-1] = newnode; 

La réponse de Niels est un bon début, mais ne traverse pas complètement l'arbre (par exemple, il se cassera si le nœud que vous recherchez est l'enfant du deuxième enfant de la racine). Il se casse aussi si la racine est l'identification que vous recherchez. Voici mes raffinements:

  function findObjectByID(root, id) { if (root.name == id){ return root; } if (root.children) { for (var k in root.children) { if (root.children[k].name == id) { return root.children[k]; } else if (root.children[k].children) { result = findObjectByID(root.children[k], id); if (result) { return result; } } } } }; 

Que dis-tu de ça.

 for(var a = 0; a < object.length; a++) { for(var b = 0; b < obj.children.length; b++) { if(object[a].children[b].id == 11) { object[a].children[b].children.push({ name: "grandchild three", id: 113, children: [] }); } } }