2012-05-23 18 views
13

Biorąc pod uwagę tablicę JavaScript obiektów, w jaki sposób mogę uzyskać klucz i wartość każdego obiektu?Uzyskaj klucz i wartość obiektu w JavaScript?

Poniższy kod pokazuje, co chciałbym zrobić, ale oczywiście nie działa:

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)); 
}); 

Tak, jak mogę dostać this.key i this.value dla każdego wpisu w tablicy?

+0

Poszukujesz 'dla ... w ', ale semantyka twojej pętli jest błędna w jej stanie. – Jon

+1

Jeśli są to jedyne wartości w obiektach, sugeruję zmienić strukturę na: 'var top_brands = {'Adidas': 100, 'Nike': 50};' –

+0

możliwy duplikat [Jak uzyskać wszystkie wartości właściwości obiekt Javascript (bez znajomości kluczy)?] (http://stackoverflow.com/questions/7306669/how-to-get-all-properties-values-of-a-javascript-object-without-knowing-the- key) –

Odpowiedz

18

Zmień swój obiekt.

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) 
); 
}); 

Jako zasada:

  • Obiekt posiada dane i strukturę.
  • 'Adidas', 'Nike', 100 i 50dane.
  • Klucze obiektu to struktura. Używanie danych jako klucza obiektu jest semantycznie błędne. Unikaj tego.

Brak semantyki w {Nike: 50}. Co to jest "Nike"? Co to jest 50?

{key: 'Nike', value: 50} jest trochę lepszy, ponieważ teraz można iterować tablicę tych obiektów, a wartości są w przewidywalnych miejscach. Ułatwia to pisanie kodu, który je obsługuje.

Jeszcze lepiej byłoby {vendor: 'Nike', itemsSold: 50}, ponieważ teraz wartości są nie tylko przewidywalne, mają również znaczące nazwy. Technicznie jest to to samo, co powyżej, ale teraz osoba zrozumie również, jakie wartości mają na myśli.

+0

dodanie "klucza" i "wartości" jest nieistotne (i powielane), zwłaszcza jeśli potrzebujesz przekazać je w Internecie. modyfikacja obj jest więcej niż podwojenie masy całkowitej json blob tutaj. proste "dla klucza w obiekcie" działa dobrze tutaj. – ekeyser

+0

Waga łańcucha JSON to inna sprawa. Obiekty, które mają przewidywalną formę i nie mieszają struktury i danych, są łatwiejsze do pracy z kodem. '{Nike: 50}' może być mniejsze, ale nie ma * wartości semantycznej *. Dodatkowo 'for .. in' nie jest bezpiecznym sposobem na iterowanie obiektów i nie powinieneś go używać. – 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])); 
    } 
    } 
}); 

Ale jeśli twoja struktura danych to var top_brands = {'Adidas': 100, 'Nike': 50};, wtedy rzecz będzie znacznie prostsza.

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

Albo użyć jQuery każda:

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

'klawisz var' proszę. –

+0

@FelixKling Tak, naprawione. – xdazz

11

Jeśli to wszystko jest przedmiotem będzie przechowywać, a następnie najlepiej dosłowne byłoby

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

Wtedy wszystko czego potrzebujesz to for...in pętla.

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... 
}); 

Btw pamiętać, że Object.keys i forEach nie są dostępne w starożytnych przeglądarek, ale należy korzystać z niektórych PolyFill tak.

0
for (var i in a) { 
    console.log(a[i],i) 
} 
Powiązane problemy