... için index / key ile TypeScript?


146

Açıklandığı gibi burada typescript bir foreach döngüsü tanıtır:

var someArray = [9, 2, 5];
for (var item of someArray) {
    console.log(item); // 9,2,5
}

Ancak herhangi bir dizin / anahtar yok mu? Gibi bir şey beklenir:

for (var item, key of someArray) { ... }

Yanıtlar:


274

.forEach zaten bu yeteneğe sahip:

const someArray = [9, 2, 5];
someArray.forEach((value, index) => {
    console.log(index); // 0, 1, 2
    console.log(value); // 9, 2, 5
});

Ama yeteneklerini istiyorsanız for...of, o zaman yapabilirsiniz mapindeksi ve değere dizi:

for (const { index, value } of someArray.map((value, index) => ({ index, value }))) {
    console.log(index); // 0, 1, 2
    console.log(value); // 9, 2, 5
}

Bu biraz uzun, bu yüzden tekrar kullanılabilir bir işleve koymaya yardımcı olabilir:

function toEntries<T>(a: T[]) {
    return a.map((value, index) => [index, value] as const);
}

for (const [index, value] of toEntries(someArray)) {
    // ..etc..
}

Yinelenebilir Sürüm

--downlevelIterationDerleyici seçeneğiyle derlerseniz ES3 veya ES5'i hedeflerken bu işe yarar .

function* toEntries<T>(values: T[] | IterableIterator<T>) {
    let index = 0;
    for (const value of values) {
        yield [index, value] as const;
        index++;
    }
}

Array.prototype.entries () - ES6 +

Eğer ES6 + ortamları hedeflediğinden edebiliyoruz, o zaman kullanabilirsiniz .entries()belirtildiği gibi yöntem Arnavion cevabı .


Ancak TypeScript, var_i dizinine sahip "için ..." ifadesini "basit bir" için "derler. Bu nedenle, TypeScript geliştiricilerinin bu _i'yi kullanmamıza izin vermesi kolay olurdu. Oyun alanı örneğine bakın: bit.ly/1R9SfBR
Mick

2
@Mick hedefe bağlıdır. ES6'ya aktarırken bunu yapmaz. Aktarım sırasında bu ekstra kodun nedeni yalnızca ES6 kodunun önceki sürümlerde çalışmasını sağlamaktır.
David Sherret

3
Nasıl bir mola yapabilirsiniz; Her şey için mi?
João Silva


@ JoãoSilva kullanabilirsiniz Array.some()ve durdurmak istediğiniz yinelemede false döndürür. Neredeyse o kadar net veya hoş breakdeğil ama işi halledecekti. Şahsen beğenmedim, muhtemelen yinelemeyi başka bir şekilde yeniden yazardım :) see stackoverflow.com/questions/2641347/…
Neek


35

Kurtarmaya "eski okul javascript" (aşina olmayan / fonksiyonel programlamayı sevenler için)

for (let i = 0; i < someArray.length ; i++) {
  let item = someArray[i];
}

2
Aslında bu cevabı en iyi tercih ederim. Her öğe için bir dizin oluşturmak için fazladan yöntemlerin kullanılması gerekmez.
bluegrounds

Çok teşekkür ederim muuuchh! Bunu bilmiyorduk :)
TSR

14

Koleksiyonlarla uğraşırken dizine erişmek için for..in TypeScript işlecini kullanabilirsiniz.

var test = [7,8,9];
for (var i in test) {
   console.log(i + ': ' + test[i]);
} 

Çıktı:

 0: 7
 1: 8
 2: 9

Demoya Bakın


"İ" nin for..in döngüsüyle int olmayan bir dize olduğunu unutmayın. "İ" ile aritmetik işlem yapılması dize birleştirmesiyle sonuçlanır. (i + 1) "01" e eşit olacaktır, örneğin i = 0
Stéphane

for..inayrıca bir nesnede bildirilen tüm işlevleri de içerdiğinden beklediğinizden daha fazlasını verebilir. Örneğin:for (var prop in window.document) { console.log(prop); }
Ken Lyon

5

Veya başka bir eski okul çözümü:

var someArray = [9, 2, 5];
let i = 0;
for (var item of someArray) {
    console.log(item); // 9,2,5
    i++;
}
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.