2012-04-26 17 views
49

¿Cómo obtendré el nombre de la clave para el siguiente? Por ejemplo, quiero "button1" y "button2"?Javascript obtener el nombre de la clave del objeto

var buttons = { 
    button1: { 
     text: 'Close', 
     onclick: function(){ 

     } 
    }, 
    button2: { 
     text: 'Close2', 
     onclick: function(){ 

     } 
    } 
} 

var i; 
for(i in buttons){ 
    if(buttons.hasOwnProperty(i)){ 
     alert(buttons[i].text); 
    } 
} 

He intentado utilizar .push() aunque esto no funcionó.

+5

Si sus nombres clave son en realidad 'button1',' button2' y así sucesivamente, es posible que desee hacer 'buttons' una serie – Zirak

Respuesta

61

Esto puede entenderse mejor si modificó la redacción un poco:

var buttons = { 
    foo: 'bar', 
    fiz: 'buz' 
}; 

for (property in buttons) { 
    console.log(property); // Outputs: foo, fiz or fiz, foo 
} 

señalar aquí que usted está interactuando sobre las propiedades del objeto, utilizando property como una referencia a cada uno durante cada ciclo subsiguiente .

MSDN dice de for (variable in [object | array ]) la siguiente:

Antes de cada iteración de un bucle, la variable se asigna el siguiente nombre de la propiedad de objeto o el siguiente índice de elemento de array. Luego puede usarlo en cualquiera de las instrucciones dentro del ciclo para hacer referencia a la propiedad del objeto o al elemento de la matriz.

Tenga en cuenta también que el orden de propiedad de un objeto no es constante y puede cambiar, a diferencia del orden de índice de una matriz. Esto podría ser útil.

+0

¿cómo conseguir foo? – Demodave

+0

@Demodave Para obtener el valor de la propiedad * foo *, simplemente debe cancelarla desde el objeto 'buttons':' buttons.foo === buttons ['foo'] '. Desde dentro del bucle for, llamarías a 'buttons [property]'. Hoy también puedes usar 'Array.entries ({foo:" bar ", fizz:" buzz "})' para generar '[['foo': 'bar'], ['fizz', 'buzz']]' . – Sampson

7

Cambio alert(buttons[i].text);-alert(i);

34

ECMAscript edition 5 también le ofrece los métodos limpios Object.keys() y Object.getOwnPropertyNames().

Así

Object.keys(buttons); // ['button1', 'button2']; 
4

Suponiendo que se tiene acceso a Prototype, esto podría funcionar. Escribí este código solo unos minutos atrás; Solo necesitaba una sola clave a la vez, por lo que no es eficiente en el tiempo para grandes listas de pares clave: valor o para escupir múltiples nombres de clave.

function key(int) { 
    var j = -1; 
    for(var i in this) { 
     j++; 
     if(j==int) { 
      return i; 
     } else { 
      continue; 
     } 
    } 
} 
Object.prototype.key = key; 

Esto está numerado para que funcione de la misma manera que las matrices, para evitar dolores de cabeza. En el caso de su código:

buttons.key(0) // Should result in "button1" 
Cuestiones relacionadas