2010-03-30 18 views
37

¿Hay alguna manera (en jQuery o JavaScript) de recorrer cada objeto y sus hijos y nietos, etc.?bucle a través de un objeto (árbol) recursivamente

Si es así ... ¿también puedo leer su nombre?

Ejemplo:

foo :{ 
    bar:'', 
    child:{ 
    grand:{ 
     greatgrand: { 
     //and so on 
     } 
    } 
    } 
} 

por lo que el bucle debe hacer algo como esto ...

loop start 
    if(nameof == 'child'){ 
    //do something 
    } 
    if(nameof == 'bar'){ 
    //do something 
    } 
    if(nameof =='grand'){ 
    //do something 
    } 
loop end 

Respuesta

58

Usted está buscando el for...in bucle:

for (var key in foo) 
{ 
    if (key == "child") 
     // do something... 
} 

Sea consciente de que for...in loops iterar sobre cualquier propiedad enumerable, incluidas las que se agregan al prototipo de un objeto. Para evitar que actúe en estas propiedades, puede utilizar el método hasOwnProperty comprobar para ver si la propiedad pertenece sólo a ese objeto:

for (var key in foo) 
{ 
    if (!foo.hasOwnProperty(key)) 
     continue;  // skip this property 
    if (key == "child") 
     // do something... 
} 

Realizar el bucle de forma recursiva puede ser tan simple como escribir una función recursiva:

// This function handles arrays and objects 
function eachRecursive(obj) 
{ 
    for (var k in obj) 
    { 
     if (typeof obj[k] == "object" && obj[k] !== null) 
      eachRecursive(obj[k]); 
     else 
      // do something... 
    } 
} 
+2

@val: sería difícil de bloquear el navegador con la recursividad objeto. El objeto debería contener una referencia a sí mismo como una de las propiedades :-) –

+1

try: '(a = {}) ._ = a' – Annan

+3

@Annan: sí, eso es más o menos a lo que me refería. El punto era simplemente no hacerlo ;-) –

0

Si desea recuperar un árbol de relaciones, puede utilizar Object.keys recursivamente.

function paths(item) { 
 
    function iter(r, p) { 
 
    var keys = Object.keys(r); 
 
    if (keys.length) { 
 
     return keys.forEach(x => iter(r[x], p.concat(x))); 
 
    } 
 
    result.push([p]) 
 
    } 
 
    var result = []; 
 
    iter(item, []); 
 
    return result; 
 
} 
 

 
var data = { 
 
    foo: { 
 
    bar: '', 
 
    child: { 
 
     grand: { 
 
     greatgrand: {} 
 
     } 
 
    } 
 
    } 
 
} 
 

 
console.log(paths(data));

Cuestiones relacionadas