Mendapatkan daftar kunci array asosiatif

258

Saya memiliki array asosiatif dalam Javascript:

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

Bagaimana cara mendapatkan kunci kamus ini? yaitu saya inginkan

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

Sunting 7 tahun kemudian: Hanya untuk mendapatkan terminologi yang benar - tidak ada yang namanya 'asosiatif array' dalam Javascript - ini secara teknis hanya sebuah objectdan itu adalah kunci objek yang kita inginkan.

Simon_Weaver
sumber
Cara sederhana dengan lodash JS - lodash.com/docs#keys
Chemical Programmer
Terima kasih telah menjelaskan terminologinya! Bisakah Anda membuatnya sedikit lebih besar di lampu merah berkedip terang?
Joe Phillips
@Joe Aku akan menjadikannya hasil pertama di google untukmu saat aku mendapat kesempatan
Simon_Weaver

Jawaban:

84

Kamu bisa memakai: Object.keys(obj)

Contoh:

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

Lihat referensi di bawah untuk dukungan browser. Ini didukung di Firefox 4.20, Chrome 5, IE9. Tautan di bawah ini berisi potongan kode yang dapat Anda tambahkan jika Object.keys()tidak didukung di browser Anda.

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

Rob de la Cruz
sumber
Saya mengalihkan ini ke jawaban yang diterima sekarang. Hanya IE8 yang tidak mendukungnya lagi (yang mana polyfill tersedia developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… )
Simon_Weaver
382

Coba ini:

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

hasOwnPropertydiperlukan karena mungkin untuk memasukkan kunci ke objek prototipe dictionary. Tetapi Anda biasanya tidak ingin kunci-kunci itu dimasukkan dalam daftar Anda.

Misalnya, jika Anda melakukan ini:

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

dan kemudian lakukan for...inperulangan dictionary, Anda akan mendapatkan adan b, tetapi Anda juga akan mendapatkannya c.

JW.
sumber
Tidak perlu mendeklarasikan "var keys = []", kecuali jika Anda perlu menggunakannya setelah loop.
mzalazar
2
@ mzalazar, Anda sebaiknya melakukan atau itu akan menjadi variabel global, yang merupakan praktik buruk.
oleh
@ B00t saya pikir dengan mendeklarasikan variabel di dalam for loop ... itu tidak akan diatur dalam ruang global ... sekarang Anda membuat saya ragu hehe :)
mzalazar
2
@ mzalazar, tetapi Anda tidak mendeklarasikannya ( kunci ) kapan saja jika Anda hanya menggunakan keys.push(key);. Anda hanya menarik (dan dengan demikian menyatakannya) dari namespace global. :)
b00t
183
for (var key in dictionary) {
  // do something with key
}

Ini untuk ... dalam pernyataan .

Wombleton
sumber
1
Hanya memperhatikan bahwa harus ada titik dua, bukan koma antara "anjing" dan array di atas. Anggap itu karena transkripsi.
wombleton
68
Sangat penting untuk memeriksa dictionary.hasOwnProperty(key)jika tidak, Anda mungkin berakhir dengan metode dari rantai prototipe ..
Tigraine
4
Dari artikel yang sama: Iterasi atas properti enumerable suatu objek, dalam urutan acak . Jika urutan kunci penting, Anda perlu melakukan sesuatu seperti mendorongnya dalam array, mengurutkannya, dan kemudian menggunakan loop for () untuk mendapatkan kunci dari array yang diurutkan untuk mengindeks objek asli.
mcmlxxxvi
1
Tentu saja adil untuk mengoptimalkan dengan menghilangkan kamus. Periksa apakah Anda yakin bahwa objek tersebut tidak memiliki prototipe. Tetapi penting untuk mewaspadai kemungkinan pewarisan prototipe dalam konteks ini, karena kamus JavaScript benar-benar objek.
fixermark
16

Hanya catatan singkat, berhati-hatilah dalam menggunakan for..in jika Anda menggunakan perpustakaan (jQuery, prototipe, dll.), Karena kebanyakan dari mereka menambahkan metode ke Objek yang dibuat (termasuk kamus).

Ini berarti bahwa ketika Anda mengulanginya, nama metode akan muncul sebagai kunci. Jika Anda menggunakan perpustakaan, lihat dokumentasi dan cari bagian enumerable, di mana Anda akan menemukan metode yang tepat untuk iterasi objek Anda.

Jesse
sumber
3

Cara JQUERY sederhana.

Inilah yang saya gunakan
DictionaryObj menjadi objek kamus javascript yang ingin Anda lalui. nilai, kunci tentu saja menjadi nama mereka dalam kamus.

 $.each(DictionaryObj, function (key, value) {
            $("#storeDuplicationList")
                .append($("<li></li>")
                .attr("value", key)
                .text(value));
        });
Exzile
sumber
1
ini memerlukan jQuery (yang baik-baik saja) tetapi Anda lupa menyebutkannya :-)
Simon_Weaver
@Exzile Nama argumen dalam definisi fungsi Anda sangat membingungkan. Dikatakan di api.jquery.com/jquery.each bahwa callback adalah Function (String propertyName, Object valueOfProperty). Nama Anda menyiratkan sebaliknya.
Chris
@ Chris Saya akan memperbarui itu untuk Anda. Terima kasih telah menunjukkannya.
Exzile
0

Saat ini saya menggunakan balasan Rob de la Cruz

Object.keys(obj)

dan dalam sebuah file yang dimuat sejak awal, saya memiliki beberapa baris kode yang dipinjam dari tempat lain di internet yang mencakup kasus versi lama dari juru bahasa skrip yang tidak memiliki Object.keys bawaan.

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

Saya pikir ini adalah yang terbaik dari kedua dunia untuk proyek-proyek besar: kode modern sederhana dan dukungan yang kompatibel untuk browser versi lama, dll.

Secara efektif itu menempatkan solusi JW ke dalam fungsi ketika Object.keys (obj) Rob de la Cruz tidak tersedia secara native.

Ivan
sumber