Ottenere un elenco di chiavi di array associativo


258

Ho un array associativo in Javascript:

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

Come ottengo le chiavi di questo dizionario? cioè voglio

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

Modifica 7 anni dopo: solo per ottenere la terminologia corretta - non esiste una "matrice associativa" in Javascript - questo è tecnicamente solo un objected è le chiavi dell'oggetto che vogliamo.


Modo semplice con lodash JS - lodash.com/docs#keys
Programmatore chimico

Grazie per aver chiarito la terminologia! Puoi forse ingrandirlo un po 'con le luci rosse lampeggianti?
Joe Phillips,

@Joe Lo farò il primo risultato in google per te quando ne avrò la possibilità
Simon_Weaver

Risposte:


84

Puoi usare: Object.keys(obj)

Esempio:

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

Vedi riferimento sotto per il supporto del browser. È supportato in Firefox 4.20, Chrome 5, IE9. Il link seguente contiene uno snippet di codice che puoi aggiungere se Object.keys()non è supportato nel tuo browser.

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


Lo sto passando alla risposta accettata ora. Solo IE8 non lo supporta più (per il quale è disponibile un polyfill developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… )
Simon_Weaver l'

382

Prova questo:

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

hasOwnPropertyè necessario perché è possibile inserire le chiavi nell'oggetto prototipo di dictionary. Ma in genere non si desidera includere quelle chiavi nell'elenco.

Ad esempio, se lo fai:

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

e poi fai un for...ingiro dictionary, otterrai ae b, ma otterrai anche c.


Non è necessario dichiarare "var keys = []", a meno che non sia necessario utilizzarlo dopo il ciclo.
mzalazar,

2
@mzalazar, farai meglio o sarà una variabile globale, che è una cattiva pratica.
bt

@ b00t però ho dichiarato che una variabile all'interno di un ciclo for ... non sarebbe stata impostata nello spazio globale ... ora mi hai fatto dubitare hehe :)
mzalazar

2
@mzalazar, ma non lo stai dichiarando ( chiavi ) in nessun momento se lo stai solo usando keys.push(key);. Stai solo estraendo (e quindi dichiarandolo) dallo spazio dei nomi globale. :)
b00t

183
for (var key in dictionary) {
  // do something with key
}

È la dichiarazione for..in .


1
Ho appena notato che ci dovrebbero essere due punti invece di una virgola tra "cani" e l'array sopra. Supponiamo che sia dovuto alla trascrizione.
Wombleton,

68
Molto importante da verificare, dictionary.hasOwnProperty(key)altrimenti potresti finire con i metodi della catena di prototipi ..
Tigraine,

4
Dallo stesso articolo: scorre le enumerabili proprietà di un oggetto, in ordine arbitrario . Se l'ordine delle chiavi è importante, è necessario fare qualcosa come inserirle in un array, ordinarlo e quindi utilizzare un ciclo for () per ottenere le chiavi dall'array ordinato con cui indicizzare l'oggetto originale.
mcmlxxxvi,

1
Ovviamente, è corretto ottimizzare omettendo il dizionario.hasOwnProperty controlla se puoi essere sicuro che all'oggetto manchi un prototipo. Ma è importante essere consapevoli della possibilità di ereditare i prototipi in questo contesto, poiché i dizionari JavaScript sono davvero oggetti.
fixermark,

16

Solo una breve nota, diffidare di usare for..in se si utilizza una libreria (jQuery, prototipo, ecc.), Poiché la maggior parte di essi aggiunge metodi agli oggetti creati (compresi i dizionari).

Ciò significa che quando li attraversi, i nomi dei metodi appariranno come chiavi. Se stai usando una libreria, guarda la documentazione e cerca una sezione enumerabile, dove troverai i metodi giusti per l'iterazione dei tuoi oggetti.


3

Modo JQUERY semplice.

Questo è ciò che uso
DictionaryObj come oggetto dizionario javascript che si desidera esaminare. valore, chiave del corso essendo i loro nomi nel dizionario.

 $.each(DictionaryObj, function (key, value) {
            $("#storeDuplicationList")
                .append($("<li></li>")
                .attr("value", key)
                .text(value));
        });

1
questo richiede jQuery (che va bene) ma hai dimenticato di menzionarlo :-)
Simon_Weaver

@Exzile I nomi degli argomenti nella definizione della funzione sono molto confusi. Dice a api.jquery.com/jquery.each che il callback è Function (String propertyName, Object valueOfProperty). I tuoi nomi implicano il contrario.
Chris,

@Chris Lo aggiornerò per te. Grazie per la segnalazione.
Exzile,

0

Attualmente sto usando la risposta di Rob de la Cruz

Object.keys(obj)

e in un file caricato all'inizio ho alcune righe di codice prese in prestito da altre parti di Internet che coprono il caso di vecchie versioni di interpreti di script che non hanno Object.keys incorporato.

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

Penso che questo sia il migliore dei due mondi per grandi progetti: semplice codice moderno e supporto retrocompatibile per vecchie versioni di browser ecc.

In effetti mette la soluzione di JW nella funzione quando Object.keys (obj) di Rob de la Cruz non è disponibile in modo nativo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.