İlişkilendirilebilir dizi anahtarlarının listesini alma


258

Javascript'te ilişkilendirilebilir bir dizi var:

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

Bu sözlüğün anahtarlarını nasıl edinebilirim? yani istiyorum

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

7 yıl sonra düzenleyin: Sadece terminolojiyi doğru hale getirmek için - Javascript'te 'ilişkilendirilebilir dizi' diye bir şey yoktur - bu teknik olarak sadece bir objectve istediğimiz nesne anahtarlarıdır.


Lodash JS ile basit bir yol - lodash.com/docs#keys
Kimyasal Programcı

Terminolojiyi açıkladığınız için teşekkürler! Parlak kırmızı yanıp sönen ışıklarda biraz daha büyüyebilir misiniz?
Joe Phillips

Ben o sizin için google ilk sonuç yapacağız @Joe bir şans olsun
Simon_Weaver

Yanıtlar:


84

Kullanabilirsiniz: Object.keys(obj)

Misal:

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

Tarayıcı desteği için aşağıdaki referansa bakın. Firefox 4.20, Chrome 5, IE9'da desteklenir. Aşağıdaki bağlantı Object.keys(), tarayıcınızda desteklenmiyorsa ekleyebileceğiniz bir kod snippet'i içerir .

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


Bunu şimdi kabul edilen cevaba geçiriyorum. Sadece IE8 (bunlar için bir polyfill kullanılabilir artık desteklemediği developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/... )
Simon_Weaver

382

Bunu dene:

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

hasOwnPropertyanahtarının prototip nesnesine anahtar eklemek mümkün olduğu için gereklidir dictionary. Ancak genellikle bu anahtarların listenize dahil edilmesini istemezsiniz.

Örneğin, bunu yaparsanız:

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

ve sonra bir for...indöngü yapın dictionary, elde edersiniz ave baynı zamanda elde edersiniz c.


Döngüden sonra kullanmanız gerekmedikçe "var keys = []" ifadesine gerek yoktur.
mzalazar

2
mzalazar, yapsan iyi olur ya da küresel bir değişken olur, ki bu kötü bir uygulamadır.
b00t

@ b00t Ben bir for döngüsü içinde bir değişken ilan ederek ... küresel alanda ayarlanmayacaktı ... şimdi bana hehe şüphesi yaptı :)
mzalazar

2
mzalazar, ama sadece kullanıyorsanız hiçbir şekilde ( anahtarlar ) ilan etmiyorsunuz keys.push(key);. Sadece küresel isim alanından çekiyorsunuz (ve böylece ilan ediyorsunuz). :)
b00t

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

Bu for..in deyimidir .


1
Sadece "köpekler" ve yukarıdaki dizi arasında virgül yerine iki nokta üst üste olması gerektiğini fark ettim. Transkripsiyondan kaynaklandığını varsayın.
wombleton

68
dictionary.hasOwnProperty(key)Aksi takdirde kontrol etmek çok önemli prototip zincirinden yöntemler ile
sonuçlanabilir

4
Aynı makaleden: Bir nesnenin numaralandırılabilir özellikleri üzerinde rasgele sırada yinelenir . Anahtar sırası önemliyse, bunları bir dizide itmek, sıralamak ve ardından orijinal nesnenin dizine ekleneceği sıralı diziden anahtarlar almak için for () döngüsü kullanmak gibi bir şey yapmanız gerekir.
mcmlxxxvi

1
Tabii ki, sözlüğü atlayarak optimize etmek doğrudur. HasOwnProperty, nesnenin bir prototipten emin olmadığından emin olup olmadığınızı kontrol edin. Ancak, JavaScript sözlükleri gerçekten nesneler olduğundan, bu bağlamda prototip kalıtım olasılığının farkında olmak önemlidir.
fixermark

16

Sadece hızlı bir not, bir kütüphane (jQuery, prototip vb.) Kullanıyorsanız, çoğu için oluşturulan Nesnelere (sözlükler dahil) yöntemler eklediğinden for..in kullanmaya dikkat edin.

Bu, üzerlerine döngü yaptığınızda yöntem adlarının anahtar olarak görüneceği anlamına gelir. Bir kitaplık kullanıyorsanız, belgelere bakın ve nesnelerinizin yinelenmesi için doğru yöntemleri bulacağınız numaralandırılabilir bir bölüm arayın.


3

Basit JQUERY yolu.

Ben
DictionaryObj kullanmak istediğiniz javascript sözlük nesnesi olmak budur. değer, tabi ki anahtar sözlükte isimleri.

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

1
Bu jQuery gerektirir (ki bu iyi) ama söz etmeyi unuttun :-)
Simon_Weaver

@Exzile İşlev tanımınızdaki bağımsız değişken adları çok kafa karıştırıcı. Api.jquery.com/jquery.each adresinde geri çağrının Function (String propertyName, Object valueOfProperty) olduğunu söylüyor. İsimleriniz bunun tersini ifade eder.
Chris

@Chris Bunu senin için güncelleyeceğim. Bunu işaret ettiğiniz için teşekkürler.
Exzile

0

Şu anda Rob de la Cruz'un cevabını kullanıyorum

Object.keys(obj)

ve erken yüklenen bir dosyada , Object.keys yerleşik olmayan kod tercümanlarının eski sürümlerini kapsayan internetin başka bir yerinden ödünç alınan bazı kod satırlarım var.

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

Bunun büyük projeler için her iki dünyanın da en iyisi olduğunu düşünüyorum: basit modern kod ve eski tarayıcı sürümleri için geriye dönük uyumlu destek vb.

Rob de la Cruz'un Object.keys (obj) yerel olarak mevcut olmadığında JW'nin çözümünü etkili bir şekilde devreye sokar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.