Iterate à travers des objets JavaScript imbriqués

J'essaie d'itérer à travers un objet imbriqué pour récupérer un objet spécifique identifié par une chaîne. Dans l'exemple d'objet ci-dessous, la chaîne d'identifiant est la propriété "étiquette". Je ne peux pas m'enrouler la façon d'itérer dans l'arbre pour retourner l'objet approprié. Toute aide ou suggestion serait grandement appréciée.

var cars = { label: 'Autos', subs: [ { label: 'SUVs', subs: [] }, { label: 'Trucks', subs: [ { label: '2 Wheel Drive', subs: [] }, { label: '4 Wheel Drive', subs: [ { label: 'Ford', subs: [] }, { label: 'Chevrolet', subs: [] } ] } ] }, { label: 'Sedan', subs: [] } ] } 

Vous pouvez créer une fonction récursive comme celle-ci pour effectuer une profondeur-première traversée de l'objet des cars .

 var findObjectByLabel = function(obj, label) { if(obj.label === label) { return obj; } for(var i in obj) { if(obj.hasOwnProperty(i)){ var foundLabel = findObjectByLabel(obj[i], label); if(foundLabel) { return foundLabel; } } } return null; }; 

Qui peut être appelé comme si

 findObjectByLabel(car, "Chevrolet"); 

Le code suivant ne suppose aucune référence circulaire, et suppose que subs est toujours un tableau (et non nul dans les noeuds de feuilles):

 function find(haystack, needle) { if (haystack.label === needle) return haystack; for (var i = 0; i < haystack.subs.length; i ++) { var result = find(haystack.subs[i], needle); if (result) return result; } return null; } 

Pour augmenter les performances pour une manipulation supplémentaire de l'arbre, il est bon de transformer l'arborescence en vue de collection de lignes, comme [obj1, obj2, obj3]. Vous pouvez stocker les relations d'objet parent-enfant pour naviguer facilement vers la portée parent / enfant.

L'élément de recherche à l'intérieur de la collection est plus efficace puis trouve l'élément à l'intérieur de l'arbre (récursivité, création de la fonction dynamique additionnelle, fermeture).

Essayez quelque chose comme ceci:

 cars.subs[0].subs[0].label 

Si vous voulez réellement itérer, vous pouvez faire une boucle for pour chaque objet dans une fonction récursive et appeler cette fonction récursive chaque fois que vous appuyez sur la propriété "subs" de cet objet. Cela peut causer des problèmes si vous avez une structure d'objet très profonde