Uzyskiwanie listy kluczy tablicy asocjacyjnej

258

Mam tablicę asocjacyjną w JavaScript:

var dictionary = {
    "cats": [1,2,3,4,5], 
    "dogs": [6,7,8,9,10]
};

Jak zdobyć klucze tego słownika? tzn. chcę

var keys = ["cats", "dogs"];

Edytuj 7 lat później: aby poprawić terminologię - nie ma czegoś takiego jak „tablica asocjacyjna” w Javascripcie - jest to technicznie po prostu objecti chcemy kluczy obiektowych.

Simon_Weaver
źródło
Prosty sposób z lodash JS - lodash.com/docs#keys
programista chemiczny
Dziękujemy za wyjaśnienie terminologii! Czy możesz zrobić to trochę większym w jasnych czerwonych migających światłach?
Joe Phillips
@Joe Zrobię dla ciebie pierwszy wynik w Google, kiedy będę miał szansę
Simon_Weaver

Odpowiedzi:

84

Możesz użyć: Object.keys(obj)

Przykład:

var dictionary = {
  "cats": [1, 2, 37, 38, 40, 32, 33, 35, 39, 36],
  "dogs": [4, 5, 6, 3, 2]
};

// Get the keys
var keys = Object.keys(dictionary);

console.log(keys);

Informacje na temat obsługi przeglądarki znajdują się poniżej. Jest obsługiwany w Firefox 4.20, Chrome 5, IE9. Poniższy link zawiera fragment kodu, który można dodać, jeśli Object.keys()nie jest obsługiwany w przeglądarce.

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/keys

Rob de la Cruz
źródło
Przełączam teraz na zaakceptowaną odpowiedź. Tylko IE8 już go nie obsługuje (dla którego dostępne jest wypełnienie wielopoziomowe developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… )
Simon_Weaver
382

Spróbuj tego:

var keys = [];
for (var key in dictionary) {
  if (dictionary.hasOwnProperty(key)) {
    keys.push(key);
  }
}

hasOwnPropertyjest potrzebne, ponieważ możliwe jest wstawienie kluczy do prototypowego obiektu dictionary. Ale zwykle nie chcesz, aby te klucze znajdowały się na liście.

Na przykład, jeśli to zrobisz:

Object.prototype.c = 3;
var dictionary = {a: 1, b: 2};

a następnie wykonać for...inpętlę dictionary, dostaniesz ai b, ale dostaniesz również c.

JW.
źródło
Nie trzeba deklarować „var keys = []”, chyba że trzeba go użyć po pętli.
mzalazar
2
@ mzalazar, lepiej to zrobisz, bo będzie to zmienna globalna, co jest złą praktyką.
b00t
@ b00t myślałem, że zadeklarowanie zmiennej w pętli for ... nie powinno być ustawione w przestrzeni globalnej ... teraz
sprawiłeś,
2
@mzalazar, ale nie zadeklarujesz go ( klucze ) w żadnym momencie, jeśli tylko używasz keys.push(key);. Po prostu wyciągasz (a więc deklarujesz) z globalnej przestrzeni nazw. :)
b00t
183
for (var key in dictionary) {
  // do something with key
}

Jest to instrukcja for..in .

wombleton
źródło
1
Właśnie zauważyłem, że między „psami” a powyższą tablicą powinien znajdować się dwukropek. Załóżmy, że jest to spowodowane transkrypcją.
wombleton
68
Bardzo ważne jest sprawdzenie, w dictionary.hasOwnProperty(key)przeciwnym razie możesz skończyć z metodami z łańcucha prototypów.
Tigraine
4
Z tego samego artykułu: Iteruje po policzalnych właściwościach obiektu, w dowolnej kolejności . Jeśli kolejność kluczy jest ważna, musisz zrobić coś takiego, jak wepchnięcie ich do tablicy, posortowanie jej, a następnie użycie pętli for (), aby uzyskać klucze z posortowanej tablicy, za pomocą której można zindeksować oryginalny obiekt.
mcmlxxxvi
1
Optymalizację można oczywiście pominąć w Dictionary.hasOwnProperty. Sprawdź, czy możesz mieć pewność, że obiekt nie ma prototypu. Ale ważne jest, aby zdawać sobie sprawę z możliwości dziedziczenia prototypów w tym kontekście, ponieważ słowniki JavaScript są naprawdę obiektami.
fixermark
16

Krótka uwaga, bądź ostrożny przy użyciu for..in, jeśli korzystasz z biblioteki (jQuery, prototyp itp.), Ponieważ większość z nich dodaje metody do tworzonych obiektów (w tym słowników).

Oznacza to, że gdy przejdziesz nad nimi, nazwy metod pojawią się jako klucze. Jeśli korzystasz z biblioteki, przejrzyj dokumentację i poszukaj wyliczalnej sekcji, w której znajdziesz odpowiednie metody iteracji twoich obiektów.

Jesse
źródło
3

Prosty sposób JQUERY.

Właśnie tego używam
DictionaryObj jako obiekt słownika javascript, którym chcesz przejść. wartość, kluczem oczywiście są ich nazwy w słowniku.

 $.each(DictionaryObj, function (key, value) {
            $("#storeDuplicationList")
                .append($("<li></li>")
                .attr("value", key)
                .text(value));
        });
Exzile
źródło
1
wymaga to jQuery (co jest w porządku), ale zapomniałeś o tym wspomnieć :-)
Simon_Weaver
@Exzile Nazwy argumentów w definicji funkcji są bardzo mylące. Mówi na api.jquery.com/jquery.each, że wywołanie zwrotne to Funkcja (String właściwośćNazwa, wartość obiektuOfProperty). Twoje imiona wskazują na odwrót.
Chris
@Chris zaktualizuję to dla ciebie. Dzięki za zwrócenie na to uwagi.
Exzile
0

Obecnie używam odpowiedzi Rob de la Cruz

Object.keys(obj)

a we wcześniej załadowanym pliku mam kilka wierszy kodu pożyczonych z innych miejsc w Internecie, które dotyczą przypadku starych wersji interpreterów skryptów, które nie mają wbudowanych kluczy Object.keys.

if (!Object.keys) {
    Object.keys = function(object) {
        var keys = [];
        for (var o in object) {
            if (object.hasOwnProperty(o)) {
                keys.push(o);
            }
        }
        return keys;
    };
}

Myślę, że jest to najlepsze z obu światów dla dużych projektów: prosty nowoczesny kod i kompatybilność wsteczna dla starych wersji przeglądarek itp.

Skutecznie wprowadza rozwiązanie JW do funkcji, gdy obiekt Object.keys (obj) Rob de la Cruz nie jest natywnie dostępny.

Ivan
źródło