TypeScript, Sözlük üzerinden döngü yapma


186

Kodumda, Dize dizinli ( burada önerildiği gibi ) birkaç sözlük var . Bu doğaçlama bir tür biraz nedeniyle, ben nasıl her anahtar (veya değer, yine de tüm anahtarları gerekir) döngü mümkün olacak herhangi bir öneri olup olmadığını merak ediyordum. Herhangi bir yardım takdir!

myDictionary: { [index: string]: any; } = {};

Denedin mi for (var key in myDictionary) { }? Döngünün içinde, keyanahtarı myDictionary[key]almak ve değeri elde etmek için kullanacaksınız
Ian

@Ian Sadece denedim, çalışmıyor gibi görünüyor. Hata yok, ancak ifade içinde hiçbir şey
çalışmıyor

1
@ Ah Ah üzgünüm, başka bir yerde bazı kodlar onunla uğraşıyordu. Mükemmel çalışıyor! Bunu seçebilmem için bir cevap vermeyi umuyor musun?
ben657

Yanıtlar:


297

Anahtar / değerler üzerinde döngü yapmak için bir for indöngü kullanın :

for (let key in myDictionary) {
    let value = myDictionary[key];
    // Use `key` and `value`
}

8
Bu genel olarak güvenli değil; hasOwnProperty testine (Jamie Stark'ın cevabında olduğu gibi) veya başka bir şeye ihtiyacı var.
Don Hatch

20
@DonHatch Genel olarak çok güvenli. Çok özel durumlarda güvenli değildir (prototipleri yanlış değiştiren veya prototipleri yanlış değiştiren kütüphaneleri dahil ettiğinizde olduğu gibi). Kodlarını büyük olasılıkla gereksiz kontrollerle
Ian

1
@Ian - Benim düşüncem, ek güvenlik önlemleri olmadan kullanmam, çünkü bir kod beklemek gibi bir kaza gibi göründüğünden, örneğin kod bir yardımcı program işlevine girerse ve sonra birisi bu işlevi basitçe olmayan bir sözlükten geçirirse Nesne, daha ziyade ek özelliklere sahip bir şey. Evet, dediğin gibi, böyle bir senaryonun olasılığını ve ciddiyetini tartmak geliştiriciye kalmış. Kendim için, zihinsel olarak en az külfetli yaklaşım, tüm durumlarda böyle bir senaryonun gerçekleşeceği garantilenmiş gibi davranmaktır.
Don Hatch

5
@Ian Sorun, nesne prototiplerini değiştiren çok fazla kütüphane olması. Gibi daha iyi basit alternatifler mevcut olduğunda, bu tür paterni savunmak kötü bir fikir gibi görünüyor Object.keys(target).forEach(key => { let value = target(key); /* Use key, value here */ });. Bu yöntemi göstermeniz gerekiyorsa, en azından henüz daha iyi bilmeyenler için riskleri ve daha iyi alternatifleri belirtin.
Yona Appletree

8
Es6 ve TypeScript zaten var. Neden hasOwnProperty yazma sorunu hala çözülmüyor? 2017'de bile ve JS'ye tüm dikkatle. Çok hayal kırıklığına uğradım.
Gherman

170

<ES 2017 :

Object.keys(obj).forEach(key => {
  let value = obj[key];
});

> = ES 2017 :

Object.entries(obj).forEach(
  ([key, value]) => console.log(key, value);
);

Bu, yinelemeden önce anahtarları sıralamama izin verdiği için aradığım çözüm
Andrew

Bilginize, bu şu anda TypeScript oyun alanında desteklenmemektedir.
Seanny123

1
TypeScript'te çalışmak için buraya bakınObject.entries
Alex Klaus

Bu mükemmel
Piyush Choudhary

67

Buna ne dersin?

for (let [key, value] of Object.entries(obj)) {
    ...
}

1
Tsconfig içinde lib es2017 gerektirir. Bkz. Stackoverflow.com/questions/45422573/…
Stéphane

Ob nesnesini açıkça {[key: string]: string} olarak ayarladığım ve {[key: string]: herhangi bir}. Bununla sadece 'değer'e erişebiliyorum. Teşekkürler
ggedde

Ve keyhiç yok saymak istiyorsanız , onu boş bırakmanız yeterlidir [ , value]. ( Bu sayı yorumuna teşekkürler .)
Dominik

51

Ian'ın bahsettiği anahtar / değer döngüsünde bir uyarı var. Nesnelerin Prototiplerine eklenmiş özniteliklere sahip olması mümkünse ve inişleci kullandığınızda bu öznitelikler dahil edilir. Bu nedenle, anahtarın prototipin değil, örneğinizin bir özelliği olduğundan emin olmak istersiniz. Eski IE'lerin indexof(v)bir anahtar olarak gösterilmeleri bilinir .

for (const key in myDictionary) {
    if (myDictionary.hasOwnProperty(key)) {
        let value = myDictionary[key];
    }
}

3
Kılları bölmeye çalışmıyorum, ama tip komut dosyası konuştuğumuzdan beri var anahtarı yerine let anahtarını kullanmamalısınız? Güzel cevap teşekkür ederim.
Luke Dupin

3
Aslında, mevcut komut dosyası sürümü ile keyve valueolabilir const.
Patrick Desjardins

hasOwnPropertyHedef nesneden denetimi çağırmamak daha iyidir , bunun yerine şunu yapın: ...if (Object.prototype.hasOwnProperty.call(myDictionary, key))...Başka, no-prototype-builtinskural ile eslint kullanıyorsanız , bir hata yayar.
sceee

6

Tüm sözlük / nesne değerlerini almanın en kısa yolu:

Object.keys(dict).map(k => dict[k]);

1

Anahtarları almak için:

function GetDictionaryKeysAsArray(dict: {[key: string]: string;}): string[] {
  let result: string[] = [];
  Object.keys(dict).map((key) =>
    result.push(key),
  );
  return result;
}

1

Ians Yanıt iyidir, ancak anahtar için let yerine const kullanmalısınız çünkü asla güncellenmez.

for (const key in myDictionary) {
    let value = myDictionary[key];
    // Use `key` and `value`
}
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.