web-dev-qa-db-fra.com

TypeScript pour ... avec index/clé?

Comme décrit ici TypeScript introduit une boucle foreach:

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

Mais n'y a-t-il pas d'index/clé? Je m'attendrais à quelque chose comme:

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

.forEach a déjà cette capacité:

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

Mais si vous voulez les capacités de for...of, alors vous pouvez map le tableau pour l'élément et l'index:

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

C'est un peu long, il est donc utile de le jeter dans une fonction réutilisable:

function toItemIndexes<T>(a: T[]) {
    return a.map((item, index) => ({ item, index }));
}

for (const {item, index} of toItemIndexes(someArray)) {
    // ..etc..
}

Version Iterable

Cela fonctionnera si vous ciblez ES3 ou ES5 si vous compilez avec l'option de compilation --downlevelIteration.

function* toItemIndexes<T>(items: T[] | IterableIterator<T>) {
    let index = 0;
    for (const item of items) {
        yield { item, index };
        index++;
    }
}
174
David Sherret

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/entries

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

Dans TS, cela nécessite de cibler ES2015 puisqu’il nécessite que le moteur d’exécution prenne en charge les itérateurs , ce que ne font pas les environnements d’exécution ES5. Vous pouvez bien sûr utiliser quelque chose comme Babel pour que la sortie fonctionne avec les environnements d'exécution ES5.

22
Arnavion

Le "javascript old school" à la rescousse (pour ceux qui ne sont pas familiers/amoureux de la programmation fonctionnelle)

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

Vous pouvez utiliser l'opérateur TypeScript for..in pour accéder à l'index lors de l'utilisation de collections.

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

Sortie:

 0: 7
 1: 8
 2: 9

Voir Démo

11
Karanvir Kang

Ou une autre solution old school:

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