2011-03-27 50 views
6

Por ejemplo, tengo un objeto:cómo obtener el nombre del objeto en javascript?

var a = { 
    'light': 'good', 
    'dark' : { 
     'black': 'bad', 
     'gray' : 'not so bad' 
    } 
} 

y un código de este tipo:

var test = function(obj) { 
    // do smth with object 
    // I need to get obj's name ('dark' in my way) 
} 
test(a.dark); 

¿Cómo obtener el nombre del objeto en el cuerpo de la función. Así que quiero decir que debería saber que el nombre de obj es 'oscuro'.

He intentado inspeccionar objetos con firebug, pero es solo mostrar la propiedad del objeto. No está mostrando algunos métodos o propiedades internas, con las cuales podré saber

Gracias.

+0

Consulte esta pregunta: http://stackoverflow.com/questions/722668/traverse-all-the-nodes-of-a-json-object-tree-with-javascript. Explica cómo obtener el nombre y los valores del objeto. –

Respuesta

11

No puede. Solo está pasando el objeto { black : 'bad', gray : 'not so bad' } al test. Este objeto no tiene intrínsecamente el nombre "oscuro", simplemente es un objeto que existe como propiedad dark del objeto a. Esta información se pierde irremediablemente al pasarla a una función.

Básicamente está tratando de recuperar el nombre de la variable que contenía el valor antes de que el valor pasara a la función. Eso no es posible.

+3

+1 Los objetos y las variables son dos bestias totalmente diferentes, cada objeto se refiere por 0 a variables de infinito y no/no debería saber nada sobre ninguno de ellos. – delnan

+0

Ok. Es una pena (para mí en tal caso).Entendí –

3

El "nombre de un objeto" no es una propiedad intrínseca de un objeto. Un "nombre" es un nombre en un contexto dado. Cuando pasas un objeto a una función, simplemente pasas ese objeto, no el contexto en el que fue nombrado ("oscuro" en tu ejemplo).

Lo que sea que desee lograr, está en el camino equivocado.

+0

Solo guardo algunas configuraciones en los objetos, y quería hacer menos propiedades en él (por ejemplo, la propiedad 'tipo' obtener del nombre pero no de la propiedad del objeto 'tipo') –

3

Me gustaría señalarle la posibilidad de iterar a través de un objeto y buscar recursivamente el nombre del padre de alguna propiedad. Con él su función test se vería así:

var test = function(rootobj,propname,rootObjName) { 
    // do smth with object AS rootobj[propname] 
    var objparents = findParents(rootobj,propname,rootObjName); 
} 
test(a,'dark','a'); 

Dónde findParents es:

function findParents(obj,key,rootName){ 
var parentName = rootname || 'ROOT', result = []; 
function iterate(obj, doIndent){ 
    var parentPrevName = '' 
    for (var property in obj) { 
    if (obj.hasOwnProperty(property)){ 

     if (obj[property].constructor === Object) { 
      parentPrevName = parentName; 
      parentName = property; 
      iterate(obj[property]); 
      parentName = parentPrevName; 
     } 
     if (key === property) { 
       result.push('Found parent for key [' 
          +key+' (value: '+obj[property] 
          +')] => '+parentName); 
     } 

    } 
    } 
} 
iterate(obj); 
return result; 
} 

El problema, por supuesto, es que una propiedad no tendría que ser único. Como en:

var a = 
{ 
    'light': 'good', 
    'dark' : { 
     'black': 'bad', 
     'gray' : 'not so bad' 
     'yellow' : { 
        'dark': 'will do', //<=there's 'dark' again! 
        'light':'never use' 
        } 
    } 
} 

Bueno, puede ser útil. Se puede encontrar una demostración de la función findParents en http://jsfiddle.net/KooiInc/Kj2b9/

+0

Entonces, pasas en '" oscuro "' como argumento para averiguar con un montón de código que el "nombre del objeto" es "oscuro" ...? ;-P – deceze

+0

No, pasa "oscuro" para averiguar el nombre de sus padres. – KooiInc

+0

Sin ofender, pero ¿no sería más fácil diseñar la función como 'función (padre, nodo) {var elem = padre [nodo]; } '? :) – deceze

3

Es posible con:

function loadProps(obj, container) { 
    for (var p in obj) { 
     container.push(p); 
     if (obj[p].constructor == Object) { 
      loadProps(obj[p], container); 
     } 
    } 
} 

a continuación:

var props = []; 
loadProps(a, props); 

console.log(props.join(",")); 
1

var a = { name:'a', 'light': 'good', 'dark' : { name: 'dark', 'black': 'bad', 'gray' : 'not so bad' } }

De esta manera usted puede hacer

console.log(a.name,a.dark.name); 
Cuestiones relacionadas