El recorte de las hojas de un árbol de objetos

votos
0

Tengo este árbol.

Es un objeto multidimensional. Cada nodo tiene a lo sumo dos propiedades, que son datay children.

He aquí un ejemplo:

{Account: { data: ['stuff'], children: {
  share: {data: ['stuff'], children: {
    share name: {},
    share hold: { data: ['stuff'] }   
  }},
  card: { children: {
    card_access: { data: ['stuff'] } 
  }},
  loan: { children: {
    loan_name: {}
  }}
}}

Necesito quitar todos los nodos que no tienen un dataatributo y no tienen ningún niños con un dataatributo.

Así, el ejemplo anterior se convertiría en:

{Account: { data: ['stuff'], children: {
  share: {data: ['stuff'], children: {
    share hold: { data: ['stuff'] }   
  }},
  card: { children: {
    card_access: { data: ['stuff'] } 
  }},
}}

¿Cuál es la forma más concisa para lograr esto en JS?

Publicado el 22/07/2015 a las 20:23
por usuario
En otros idiomas...                            


1 respuestas

votos
1

Esto hace el truco:

function trimEmpty(obj) {
  for(var o in obj) {
    if(typeof obj[o] === 'object') trimEmpty(obj[o]);
    if(JSON.stringify(obj[o]) === '{}') delete obj[o];
  }
} //trimEmpty

trimEmpty(obj);

Retazo:

var obj = {
  Account: {
    data: ['stuff'],
    children: {
      share: {
        data: ['stuff'],
        children: {
          share_name: {},
          share_hold: {
            data: ['stuff']
          }
        }
      },
      card: {
        children: {
          card_access: {
            data: ['stuff']
          }
        }
      },
      loan: {
        children: {
          loan_name: {}
        }
      }
    }
  }
}

function trimEmpty(obj) {
  for(var o in obj) {
    if(typeof obj[o] === 'object') trimEmpty(obj[o]);
    if(JSON.stringify(obj[o]) === '{}') delete obj[o];
  }
} //trimEmpty

trimEmpty(obj);
document.querySelector('pre').innerHTML= JSON.stringify(obj, null, 2);
<pre></pre>

Respondida el 22/07/2015 a las 20:41
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more