Katakanlah saya memiliki array asosiatif Javascript (alias hash, alias kamus):
var a = new Array();
a['b'] = 1;
a['z'] = 1;
a['a'] = 1;
Bagaimana cara saya mengulang kunci dalam urutan yang diurutkan? Jika itu membantu menyederhanakan banyak hal, saya bahkan tidak membutuhkan nilainya (semuanya hanya angka 1).
javascript
mike
sumber
sumber
a = {};
.Jawaban:
Anda tidak dapat mengulanginya secara langsung, tetapi Anda dapat menemukan semua kuncinya dan kemudian menyortirnya.
Namun, variabel 'a' tidak perlu dibuat menjadi array. Anda benar-benar hanya menggunakannya sebagai objek dan harus membuatnya seperti ini:
sumber
for
loop jikaobj.hasOwnProperty(key)
.Anda dapat menggunakan metode bawaan Object.keys :
(Catatan: ini tidak berfungsi di browser yang sangat lama yang tidak mendukung EcmaScript5, terutama IE6, 7 dan 8. Untuk detail statistik terkini, lihat tabel ini )
sumber
if (!Object.keys) { Object.keys = function (obj) { var op, result = []; for (op in obj) { if (obj.hasOwnProperty(op) { result.push(op) } } return result }
Anda bahkan dapat membuat prototipe ke objek:
dan penggunaan:
sumber
key -> value
hubungan.Saya setuju dengan jawaban Swingley , dan saya pikir ini adalah poin penting karena banyak solusi yang lebih rumit ini hilang. Jika Anda hanya mementingkan kunci dalam array asosiatif dan semua nilainya adalah '1', maka cukup simpan 'keys' sebagai nilai dalam array.
Dari pada:
Menggunakan:
Satu kekurangannya adalah Anda tidak dapat menentukan apakah kunci tertentu disetel dengan mudah. Lihat jawaban ini untuk fungsi javascript inarray jawaban untuk masalah itu. Satu masalah dengan solusi yang disajikan adalah itu
a.hasValue('key')
akan menjadi sedikit lebih lambat daria['key']
. Itu mungkin atau mungkin tidak penting dalam kode Anda.sumber
Tidak ada cara ringkas untuk secara langsung memanipulasi "kunci" dari objek Javascript. Ini tidak benar-benar dirancang untuk itu. Apakah Anda memiliki kebebasan untuk menempatkan data Anda di sesuatu yang lebih baik daripada objek biasa (atau Array, seperti yang disarankan kode sampel Anda)?
Jika demikian, dan jika pertanyaan Anda dapat dirumuskan ulang sebagai "Objek seperti kamus apa yang harus saya gunakan jika saya ingin mengulangi kunci dalam urutan yang diurutkan?" maka Anda bisa mengembangkan objek seperti ini:
Jika Anda tidak memiliki kendali atas fakta bahwa data berada dalam objek biasa, utilitas ini akan mengonversi objek reguler ke kamus yang berfungsi penuh:
Ini adalah definisi objek (bukan fungsi konstruktor yang dapat digunakan kembali) untuk kesederhanaan; edit sesuka hati.
sumber
Dapatkan kunci di
for
loop pertama , urutkan, gunakan hasil yang diurutkan difor
loop ke-2 .sumber
Anda dapat menggunakan
keys
fungsi dari pustaka underscore.js untuk mendapatkan kunci, lalusort()
metode array untuk mengurutkannya:The
keys
fungsi dalam kode sumber garis bawah ini:sumber
sumber
sumber
Saya sangat suka ide prototipe @ luke-schafer, tetapi juga mendengar apa yang dia katakan tentang masalah dengan prototipe. Bagaimana dengan menggunakan fungsi sederhana?
Ini tampaknya menghilangkan masalah dengan prototipe dan masih menyediakan iterator yang diurutkan untuk objek. Saya sebenarnya bukan ahli JavaScript, jadi saya ingin tahu apakah solusi ini menyembunyikan kekurangan yang saya lewatkan.
sumber