2012-05-23 39 views
13

Dada una matriz de objetos JavaScript, ¿cómo puedo obtener la clave y el valor de cada objeto?Obtener la clave y el valor del objeto en JavaScript?

El código siguiente muestra lo que me gustaría hacer, pero, obviamente, no funciona:

var top_brands = [ { 'Adidas' : 100 }, { 'Nike' : 50 }]; 
var brand_options = $("#top-brands"); 
$.each(top_brands, function() { 
    brand_options.append($("<option />").val(this.key).text(this.key + " " + this.value)); 
}); 

Así que, ¿cómo se puede conseguir que this.key y this.value para cada entrada en la matriz?

+0

Está buscando 'for ... in', pero la semántica de su ciclo está equivocada, tal como está. – Jon

+1

Si estos son los únicos valores en los objetos, sugiero cambiar la estructura a: 'var top_brands = {'Adidas': 100, 'Nike': 50};' –

+0

posible duplicado de [Cómo obtener todos los valores de las propiedades de un objeto Javascript (sin conocer las claves)?] (http://stackoverflow.com/questions/7306669/how-to-get-all-properties-values-of-a-javascript-object-without-knowing-the- clave) –

Respuesta

18

Cambie su objeto.

var top_brands = [ 
    { key: 'Adidas', value: 100 }, 
    { key: 'Nike', value: 50 } 
]; 

var $brand_options = $("#top-brands"); 

$.each(top_brands, function(brand) { 
    $brand_options.append(
    $("<option />").val(brand.key).text(brand.key + " " + brand.value) 
); 
}); 

Como regla general:

  • Un objeto tiene datos y estructura.
  • 'Adidas', 'Nike', 100 y 50 son de datos.
  • Las claves de objeto son estructura. Usar datos como la clave del objeto es semánticamente incorrecta. Evítalo.

No hay semántica en {Nike: 50}. ¿Qué es "Nike"? ¿Qué es 50?

{key: 'Nike', value: 50} es un poco mejor, ya que ahora puede iterar una matriz de estos objetos y los valores están en lugares predecibles. Esto hace que sea fácil escribir el código que los maneja.

Mejor aún sería {vendor: 'Nike', itemsSold: 50}, porque ahora los valores no están solo en lugares predecibles, sino que también tienen nombres significativos. Técnicamente, eso es lo mismo que arriba, pero ahora una persona también entendería lo que se supone que significan los valores.

+0

agregar "clave" y "valor" es extraño (y duplicado) especialmente si necesita pasar un montón de esto en la web. modificar el obj es más que duplicar el peso del total json blob aquí. simple "for key in object" funciona bien aquí. – ekeyser

+0

El peso de la cadena JSON es una cuestión diferente. Los objetos que tienen una forma predecible y no mezclan estructura y datos son * manera * más fáciles de trabajar en el código. '{Nike: 50}' podría ser más pequeño, pero no tiene ningún valor * semántico *. Además 'for .. in' no es una forma segura de iterar objetos y no deberías usarlo. – Tomalak

18
$.each(top_brands, function() { 
    var key = Object.keys(this)[0]; 
    var value = this[key]; 
    brand_options.append($("<option />").val(key).text(key + " " + value)); 
}); 
8
$.each(top_brands, function(index, el) { 
    for (var key in el) { 
    if (el.hasOwnProperty(key)) { 
     brand_options.append($("<option />").val(key).text(key+ " " + el[key])); 
    } 
    } 
}); 

Pero si la estructura de datos es var top_brands = {'Adidas': 100, 'Nike': 50};, entonces lo será mucho más sencillo.

for (var key in top_brands) { 
    if (top_brands.hasOwnProperty(key)) { 
     brand_options.append($("<option />").val(key).text(key+ " " + el[key])); 
    } 
} 

O utilice el jQuery cada uno:

$.each(top_brands, function(key, value) { 
    brand_options.append($("<option />").val(key).text(key + " " + value)); 
}); 
+0

'var clave' por favor. –

+0

@FelixKling Sí, corregido. – xdazz

11

Si esto es todo lo que el objeto se va a almacenar, entonces mejor literal sería

var top_brands = { 
    'Adidas' : 100, 
    'Nike' : 50 
    }; 

Entonces todo lo que necesita es un for...in lazo.

for (var key in top_brands){ 
    console.log(key, top_brands[key]); 
    } 
0
Object.keys(top_brands).forEach(function(key) { 
    var value = top_brands[key]; 
    // use "key" and "value" here... 
}); 

Por cierto, tenga en cuenta que Object.keys y forEach no están disponibles en los navegadores antiguos, pero se debe usar algún polyfill de todos modos.

0
for (var i in a) { 
    console.log(a[i],i) 
} 
Cuestiones relacionadas