Abrufen einer Liste assoziativer Array-Schlüssel

258

Ich habe ein assoziatives Array in Javascript:

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

Wie bekomme ich die Schlüssel dieses Wörterbuchs? dh ich will

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

7 Jahre später bearbeiten: Nur um die Terminologie korrekt zu machen - es gibt kein "assoziatives Array" in Javascript - dies ist technisch gesehen nur ein objectund es sind die Objektschlüssel, die wir wollen.

Simon_Weaver
quelle
Einfacher Weg mit lodash JS - lodash.com/docs#keys
Chemischer Programmierer
Vielen Dank für die Klarstellung der Terminologie! Können Sie das vielleicht in leuchtend roten Blinklichtern etwas größer machen?
Joe Phillips
@ Joe Ich werde es das erste Ergebnis in Google für Sie machen, wenn ich eine Chance
bekomme

Antworten:

84

Sie können verwenden: Object.keys(obj)

Beispiel:

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

Siehe unten stehende Informationen zur Browserunterstützung. Es wird in Firefox 4.20, Chrome 5, IE9 unterstützt. Der folgende Link enthält ein Code-Snippet, das Sie hinzufügen können, wenn Object.keys()es in Ihrem Browser nicht unterstützt wird.

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

Rob de la Cruz
quelle
Ich schalte dies jetzt auf die akzeptierte Antwort um. Nur IE8 unterstützt es nicht mehr (für die eine Polyfüllung verfügbar ist. Developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… )
Simon_Weaver
382

Versuche dies:

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

hasOwnPropertywird benötigt, weil es möglich ist, Schlüssel in das Prototypobjekt von einzufügen dictionary. Normalerweise möchten Sie jedoch nicht, dass diese Schlüssel in Ihre Liste aufgenommen werden.

Wenn Sie dies beispielsweise tun:

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

und dann mache eine for...inSchleife über dictionary, du wirst aund b, aber du wirst auch bekommen c.

JW.
quelle
Sie müssen "var keys = []" nicht deklarieren, es sei denn, Sie müssen es nach der Schleife verwenden.
Mzalazar
2
@mzalazar, du machst es besser oder es wird eine globale Variable sein, was eine schlechte Praxis ist.
B00t
@ b00t ich dachte, dass durch das Deklarieren einer Variablen innerhalb einer for-Schleife ... es nicht im globalen Raum gesetzt werden würde ... jetzt hast du mich zweifeln lassen, hehe :)
mzalazar
2
@mzalazar, aber Sie deklarieren es zu keinem Zeitpunkt ( Schlüssel ), wenn Sie nur verwenden keys.push(key);. Sie ziehen (und deklarieren es einfach) nur aus dem globalen Namespace. :)
b00t
183
for (var key in dictionary) {
  // do something with key
}

Es ist die for..in Aussage .

Wombleton
quelle
1
Ich habe gerade bemerkt, dass zwischen "Hunden" und dem obigen Array ein Doppelpunkt anstelle eines Kommas stehen sollte. Angenommen, es liegt an der Transkription.
Wombleton
68
Es ist sehr wichtig zu prüfen, ob dictionary.hasOwnProperty(key)Sie sonst Methoden aus der Prototypenkette erhalten.
Tigraine
4
Aus demselben Artikel: Iteriert in beliebiger Reihenfolge über die aufzählbaren Eigenschaften eines Objekts . Wenn die Schlüsselreihenfolge wichtig ist, müssen Sie sie beispielsweise in ein Array verschieben, sortieren und dann eine for () - Schleife verwenden, um Schlüssel aus dem sortierten Array abzurufen, mit dem das ursprüngliche Objekt indiziert werden soll.
mcmlxxxvi
1
Es ist natürlich fair, durch Weglassen des Dictionary.hasOwnProperty zu optimieren, ob Sie sicher sein können, dass dem Objekt ein Prototyp fehlt. Es ist jedoch wichtig, sich der Möglichkeit der Vererbung von Prototypen in diesem Zusammenhang bewusst zu sein, da JavaScript-Wörterbücher wirklich Objekte sind.
Fixermark
16

Nur eine kurze Anmerkung: Seien Sie vorsichtig bei der Verwendung von for..in, wenn Sie eine Bibliothek (jQuery, Prototyp usw.) verwenden, da die meisten von ihnen Methoden zu erstellten Objekten (einschließlich Wörterbüchern) hinzufügen.

Dies bedeutet, dass beim Überlaufen von Methoden Methodennamen als Schlüssel angezeigt werden. Wenn Sie eine Bibliothek verwenden, lesen Sie die Dokumentation und suchen Sie nach einem Abschnitt mit Aufzählungen, in dem Sie die richtigen Methoden für die Iteration Ihrer Objekte finden.

Jesse
quelle
3

Einfache JQUERY-Methode.

Dies ist, was ich benutze
DictionaryObj als das Javascript-Wörterbuch-Objekt, das Sie durchlaufen möchten. Wert, Schlüssel natürlich sind die Namen von ihnen im Wörterbuch.

 $.each(DictionaryObj, function (key, value) {
            $("#storeDuplicationList")
                .append($("<li></li>")
                .attr("value", key)
                .text(value));
        });
Exzile
quelle
1
Dies erfordert jQuery (was in Ordnung ist), aber Sie haben vergessen, es zu erwähnen :-)
Simon_Weaver
@Exzile Die Argumentnamen in Ihrer Funktionsdefinition sind sehr verwirrend. Unter api.jquery.com/jquery.each heißt es, dass der Rückruf Function (String propertyName, Object valueOfProperty) ist. Ihre Namen implizieren das Gegenteil.
Chris
@ Chris Ich werde das für Sie aktualisieren. Vielen Dank für den Hinweis.
Exzile
0

Ich verwende derzeit die Antwort von Rob de la Cruz

Object.keys(obj)

und in einer früh geladenen Datei sind einige Codezeilen von anderen Stellen im Internet entlehnt, die den Fall alter Versionen von Skriptinterpreten abdecken, in die Object.keys nicht integriert sind.

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

Ich denke, dies ist das Beste aus beiden Welten für große Projekte: einfacher moderner Code und abwärtskompatible Unterstützung für alte Browserversionen usw.

Tatsächlich wird die Lösung von JW in die Funktion aufgenommen, wenn die Object.keys (obj) von Rob de la Cruz nicht nativ verfügbar sind.

Ivan
quelle