Guide JavaScript Partie 5: Tableaux et boucles

Aujourd'hui, dans la cinquième partie de la traduction du cours JavaScript, nous allons parler des tableaux et des boucles. Les tableaux sont utilisés pour résoudre de nombreux problèmes. Travaille souvent avec des tableaux à l'aide de boucles.

Partie 1: premier programme, fonctionnalités linguistiques, normes
Partie 2: style de code et structure du programme
Partie 3: variables, types de données, expressions, objets
Partie 4: caractéristiques
Partie 5: tableaux et boucles
Partie 6: exceptions, points-virgules, littéraux génériques
Partie 7: mode strict, ce mot-clé, événements, modules, calculs mathématiques
Partie 8: Présentation des fonctionnalités d'ES6
Partie 9: Présentation des normes ES7, ES8 et ES9



Tableaux


Les tableaux, objets de type Array , évoluent avec d'autres mécanismes du langage. Ce sont des listes de valeurs numérotées.

Le premier élément du tableau a un index (clé) de 0; cette approche est utilisée dans de nombreux langages de programmation.

Dans cette section, nous considérerons les méthodes modernes de travail avec les tableaux.

▍Initialisation des tableaux


Voici quelques façons d'initialiser des tableaux.

 const a = [] const a = [1, 2, 3] const a = Array.of(1, 2, 3) const a = Array(6).fill(1) //   ,   6 ,  1 

Afin d'accéder à un élément individuel du tableau, utilisez une construction composée de crochets qui contiennent l'index de l'élément du tableau. Les éléments du tableau peuvent être lus ou écrits.

 const a = [1, 2, 3] console.log(a) //[ 1, 2, 3 ] const first = a[0] console.log(first) //1 a[0] = 4 console.log(a) //[ 4, 2, 3 ] 

Le constructeur de Array pour déclarer des tableaux n'est pas recommandé.

 const a = new Array() //  const a = new Array(1, 2, 3) //  

Cette méthode ne doit être utilisée que lors de la déclaration de tableaux typés .

▍Obtenir la longueur du tableau


Pour connaître la longueur d'un tableau, vous devez vous référer à sa propriété length .

 const l = a.length 

▍Vérification d'un tableau à l'aide de la méthode every ()


La méthode du tableau every() peut être utilisée pour organiser la vérification de tous leurs éléments en utilisant une certaine condition. Si tous les éléments du tableau remplissent la condition, la fonction renverra true , sinon elle renverra false .

Cette méthode reçoit une fonction qui prend les arguments currentValue (élément de tableau actuel), index (index de l'élément de tableau actuel) et array (le tableau lui-même). Il peut également prendre une valeur facultative, utilisée comme this lors de l'exécution de la fonction qui lui est transmise.
Par exemple, vérifiez si les valeurs de tous les éléments du tableau sont supérieures à 10.

 const a = [11, 12, 13] const b = [5, 6, 25] const test = el => el > 10 console.log(a.every(test)) //true console.log(b.every(test)) //false 

Ici, dans la fonction test() , nous ne sommes intéressés que par le premier argument qui lui est passé, nous le déclarons donc, en spécifiant uniquement le paramètre el , dans lequel la valeur correspondante tombera.

▍ Vérification d'un tableau à l'aide de la méthode some ()


Cette méthode est très similaire à la méthode every() , mais elle retourne true si au moins un des éléments du tableau satisfait la condition spécifiée par la fonction qui lui est passée.

▍Créez un tableau basé sur un tableau existant à l'aide de la méthode map ()


La méthode map() des tableaux vous permet d'itérer sur les tableaux, en appliquant à chaque élément transmis à cette méthode une fonction qui convertit l'élément et crée de nouveaux tableaux à partir des valeurs reçues. Voici, par exemple, comment obtenir un nouveau tableau, qui est le résultat de la multiplication de tous les éléments du tableau d'origine par 2.

 const a = [1, 2, 3] const double = el => el * 2 const doubleA = a.map(double) console.log(a) //[ 1, 2, 3 ] console.log(doubleA) //[ 2, 4, 6 ] 

▍ Filtrage d'un tableau à l'aide de la méthode filter ()


La méthode filter() est similaire à la méthode map() , mais elle vous permet de créer de nouveaux tableaux contenant uniquement les éléments des tableaux d'origine qui remplissent la condition spécifiée par la méthode filter() passée à la fonction.

▍ méthode Reduce ()


La méthode reduce() vous permet d'appliquer une fonction donnée à l'accumulateur et à chaque valeur du tableau, en réduisant le tableau à une seule valeur (cette valeur peut avoir un type primitif ou objet). Cette méthode prend une fonction de conversion et une valeur de batterie initiale facultative. Prenons un exemple.

 const a = [1, 2, 3, 4].reduce((accumulator, currentValue, currentIndex, array) => { return accumulator * currentValue }, 1) console.log(a) //24 // 1: 1 * 1 = 1 // 2: 1 * 2 = 2 // 3: 2 * 3 = 6 // 4: 6 * 4 = 24 

Ici, nous recherchons le produit de tous les éléments du tableau décrit à l'aide d'un littéral, définissant la valeur initiale de l'accumulateur 1.

▍ Énumération d'un tableau à l'aide de la méthode forEach ()


La méthode forEach() des tableaux peut être utilisée pour itérer sur les valeurs des tableaux et pour effectuer certaines actions sur eux, spécifiées par la fonction passée à la méthode. Par exemple, nous affichons, un à la fois, les éléments du tableau dans la console.

 const a = [1, 2, 3] a.forEach(el => console.log(el)) //1 //2 //3 

Si vous devez arrêter ou interrompre la boucle lors de l'itération sur un tableau, alors lorsque vous utilisez forEach() devrez forEach() une exception. Par conséquent, si au cours de la résolution d'un certain problème, il peut être nécessaire d'interrompre le cycle, il est préférable de choisir une autre manière d'itérer les éléments du tableau.

▍Sélection d'un tableau à l'aide de l'opérateur for ... of


L'opérateur for...of est apparu dans la norme ES6. Il vous permet d'itérer sur des objets itérables (y compris des tableaux). Voici comment l'utiliser.

 const a = [1, 2, 3] for (let v of a) { console.log(v) } //1 //2 //3 

À chaque itération de la boucle, l'élément suivant du tableau a entre dans la variable v .

▍ Énumération d'un tableau à l'aide de l'instruction for


L'instruction for vous permet d'organiser des boucles, qui, en particulier, peuvent être utilisées pour parcourir (ou initialiser) des tableaux en accédant à leurs éléments par index. En règle générale, l'indice de l'élément suivant est obtenu à l'aide d'un compteur de boucles.

 const a = [1, 2, 3] for (let i = 0; i < a.length; i += 1) { console.log(a[i]) } //1 //2 //3 

Si, pendant l'exécution de la boucle, vous devez ignorer son itération, vous pouvez utiliser la commande continue . Pour terminer prématurément le cycle, vous pouvez utiliser la commande break . Si vous utilisez la commande return dans une boucle, par exemple, située dans une certaine fonction, la boucle et la fonction se termineront et la valeur retournée avec return ira à l'endroit où la fonction a été appelée.

▍ Méthode @@ itérateur


Cette méthode est apparue dans la norme ES6. Il vous permet d'obtenir le soi-disant "itérateur d'un objet" - un objet qui dans ce cas vous permet d'organiser une itération des éléments du tableau. Un itérateur de tableau peut être obtenu en utilisant le symbole (ces symboles sont appelés "symboles connus") Symbol.iterator . Après avoir reçu l'itérateur, vous pouvez accéder à sa méthode next() , qui, à chaque appel, renvoie une structure de données contenant l'élément suivant du tableau.

 const a = [1, 2, 3] let it = a[Symbol.iterator]() console.log(it.next().value) //1 console.log(it.next().value) //2 console.log(it.next().value) //3 

Si vous appelez la méthode next() fois le dernier élément du tableau atteint, elle renverra, en tant que valeur de l'élément, undefined . L'objet renvoyé par la méthode next() contient la value et les propriétés done . La propriété done valeur false jusqu'à ce que le dernier élément du tableau soit atteint. Dans notre cas, si nous l'appelons.next it.next() pour la quatrième fois, il renverra l'objet { value: undefined, done: true } , tandis que dans les trois appels précédents, cet objet ressemblerait à { value: , done: false } .

La méthode du tableau entries() renvoie un itérateur qui vous permet d'itérer sur les paires clé-valeur du tableau.

 const a = [1, 2, 3] let it = a.entries() console.log(it.next().value) //[0, 1] console.log(it.next().value) //[1, 2] console.log(it.next().value) //[2, 3] 

La méthode keys() vous permet d'itérer sur les clés d'un tableau.

 const a = [1, 2, 3] let it = a.keys() console.log(it.next().value) //0 console.log(it.next().value) //1 console.log(it.next().value) //2 

▍Ajout d'éléments à la fin d'un tableau


Pour ajouter des éléments à la fin du tableau, utilisez la méthode push() .

 a.push(4) 

▍Ajout d'éléments au début du tableau


Pour ajouter des éléments au début du tableau, utilisez la méthode unshift() .

 a.unshift(0) a.unshift(-2, -1) 

▍ Suppression des éléments du tableau


Vous pouvez supprimer un élément de la fin du tableau tout en renvoyant cet élément à l'aide de la méthode pop() .

 a.pop() 

De même, en utilisant la méthode shift() , vous pouvez supprimer un élément du début du tableau.

 a.shift() 

La même chose, mais indiquant déjà la position de la suppression des éléments et leur nombre, se fait en utilisant la méthode splice() .

 a.splice(0, 2) //    2     a.splice(3, 2) //    2 ,    3 

▍ Suppression des éléments du tableau et insertion d'autres éléments à la place


Afin d'utiliser une opération pour supprimer certains éléments du tableau et insérer d'autres éléments à la place, la méthode familière splice() est utilisée.

Par exemple, ici, nous supprimons 3 éléments du tableau à partir de l'index 2, après quoi nous ajoutons deux autres éléments au même endroit:

 const a = [1, 2, 3, 4, 5, 6] a.splice(2, 3, 'a', 'b') console.log(a) //[ 1, 2, 'a', 'b', 6 ] 

▍Combiner plusieurs tableaux


Pour combiner plusieurs tableaux, vous pouvez utiliser la méthode concat() , qui renvoie un nouveau tableau.

 const a = [1, 2] const b = [3, 4] const c = a.concat(b) console.log(c) //[ 1, 2, 3, 4 ] 

▍Trouver des éléments dans un tableau


Dans la norme ES5, la méthode indexOf() est apparue, qui retourne l'index de la première occurrence de l'élément de tableau souhaité. Si l'élément est introuvable dans le tableau, -1 est renvoyé.

 const a = [1, 2, 3, 4, 5, 6, 7, 5, 8] console.log(a.indexOf(5)) //4 console.log(a.indexOf(23)) //-1 

La méthode lastIndexOf() renvoie l'index de la dernière occurrence de l'élément dans le tableau, ou -1 si l'élément n'est pas trouvé.

 const a = [1, 2, 3, 4, 5, 6, 7, 5, 8] console.log(a.lastIndexOf(5)) //7 console.log(a.lastIndexOf(23)) //-1 

Dans ES6, la méthode find() des tableaux est apparue, qui effectue une recherche de tableau en utilisant la fonction qui lui est transmise. Si la fonction renvoie true , la méthode renvoie la valeur du premier élément trouvé. Si l'élément est introuvable, la fonction retournera undefined .

Son utilisation peut se présenter comme suit.

 a.find(x => x.id === my_id) 

Ici, dans un tableau contenant des objets, un élément est recherché, dont la propriété id est égale à celle spécifiée.

La méthode findIndex() est similaire à find() , mais elle retourne l'index de l'élément trouvé ou undefined .

La méthode includes() est apparue dans ES7, ce qui vous permet de vérifier la présence d'un certain élément dans un tableau. Il renvoie true ou false , trouvant ou ne trouvant pas un élément intéressant le programmeur.

 a.includes(value) 

En utilisant cette méthode, il est possible de vérifier la présence de certains éléments et non du tableau entier, mais seulement d'une partie de celui-ci, en commençant par l'index spécifié lors de l'appel de cette méthode. L'index est spécifié à l'aide du deuxième paramètre facultatif de cette méthode.

 a.includes(value, i) 

▍ Obtention d'un fragment d'un tableau


Afin d'obtenir une copie d'un fragment du tableau en tant que nouveau tableau, vous pouvez utiliser la méthode slice() . Si cette méthode est appelée sans arguments, le tableau renvoyé sera une copie complète de l'original. Il prend deux paramètres facultatifs. Le premier définit l'indice de départ du fragment, le second définit la fin. Si l'index de fin n'est pas spécifié, le tableau est copié de l'index de début spécifié vers la fin.

 const a = [1, 2, 3, 4, 5, 6, 7, 8, 9] console.log(a.slice(4)) //[ 5, 6, 7, 8, 9 ] console.log(a.slice(3,7)) //[ 4, 5, 6, 7 ] 

▍Sort array


Pour organiser le tri des éléments du tableau par ordre alphabétique ( 0-9A-Za-z ), la méthode sort() est utilisée sans lui passer d'arguments.

 const a = [1, 2, 3, 10, 11] a.sort() console.log(a) //[ 1, 10, 11, 2, 3 ] const b = [1, 'a', 'Z', 3, 2, 11] b.sort() console.log(b) //[ 1, 11, 2, 3, 'Z', 'a' ] 

Vous pouvez transmettre une fonction à cette méthode qui définit l'ordre de tri. La fonction accepte, pour la comparaison de deux éléments, les paramètres a et b . Il renvoie un nombre négatif si a inférieur à b selon un critère, 0 s'ils sont égaux et un nombre positif si a supérieur à b . Lors de l'écriture d'une fonction similaire pour trier des tableaux numériques, elle peut renvoyer le résultat de la soustraction de a et b . Ainsi, renvoyer le résultat de l'évaluation de l'expression a - b signifie trier le tableau dans l'ordre croissant, renvoyer le résultat de l'évaluation de l'expression b - a triera le tableau dans l'ordre décroissant.

 const a = [1, 10, 3, 2, 11] console.log(a.sort((a, b) => a - b)) //[ 1, 2, 3, 10, 11 ] console.log(a.sort((a, b) => b - a)) //[ 11, 10, 3, 2, 1 ] 

Pour inverser la séquence des éléments du tableau, vous pouvez utiliser la méthode reverse() . Comme sort() , il modifie le tableau pour lequel il est appelé.

▍Obtenir une représentation sous forme de chaîne d'un tableau


Pour obtenir une représentation sous forme de chaîne d'un tableau, vous pouvez utiliser sa toString() .

 a.toString() 

Un résultat similaire est donné par la méthode join() , appelée sans arguments.

 a.join() 

Pour cela, comme argument, vous pouvez passer les éléments séparateurs.

 const a = [1, 10, 3, 2, 11] console.log(a.toString()) //1,10,3,2,11 console.log(a.join()) //1,10,3,2,11 console.log(a.join(', ')) //1, 10, 3, 2, 11 

▍Création de copies de tableaux


Pour créer une copie du tableau en copiant les valeurs du tableau d'origine dans le nouveau tableau, vous pouvez utiliser la méthode Array.from() . Il convient également pour créer des tableaux à partir d'objets de type tableau (à partir de chaînes, par exemple).

 const a = 'a string' const b = Array.from(a) console.log(b) //[ 'a', ' ', 's', 't', 'r', 'i', 'n', 'g' ] 

La méthode Array.of() peut également être utilisée pour copier des tableaux, ainsi que pour «assembler» des tableaux à partir de divers éléments. Par exemple, pour copier les éléments d'un tableau dans un autre, vous pouvez utiliser la construction suivante.

 const a = [1, 10, 3, 2, 11] const b = Array.of(...a) console.log(b) // [ 1, 10, 3, 2, 11 ] 

La méthode copyWithin() est utilisée pour copier les éléments du tableau à un certain endroit de ce tableau lui-même. Son premier argument spécifie l'index initial de la position cible, le second l'index initial de la position de la source de l'élément et le troisième paramètre, facultatif, indique l'indice final de la position de la source de l'élément. Si vous ne le spécifiez pas, tout sera copié à l'emplacement spécifié du tableau, à partir de l'index initial de la position source jusqu'à la fin du tableau.

 const a = [1, 2, 3, 4, 5] a.copyWithin(0, 2) console.log(a) //[ 3, 4, 5, 4, 5 ] 

Cycles


En parlant des tableaux ci-dessus, nous avons déjà trouvé quelques façons d'organiser les boucles. Cependant, les boucles en JavaScript ne sont pas seulement utilisées pour travailler avec des tableaux, et nous avons considéré loin de tous leurs types. Par conséquent, nous allons maintenant consacrer un peu de temps à discuter des différentes manières d'organiser les boucles en JavaScript et parler de leurs fonctionnalités.

▍ pour boucle


Prenons un exemple d'application de ce cycle.

 const list = ['a', 'b', 'c'] for (let i = 0; i < list.length; i++) { console.log(list[i]) //,     console.log(i) // } 

Comme déjà mentionné, vous pouvez interrompre l'exécution d'une telle boucle à l'aide de la commande break , et vous pouvez ignorer l'itération en cours et passer directement à la suivante à l'aide de la commande continue .

▍ pour chaque cycle


Nous avons également discuté de ce cycle. Voici un exemple d'itération sur un tableau l'utilisant.

 const list = ['a', 'b', 'c'] list.forEach((item, index) => { console.log(item) // console.log(index) // }) //     ,      list.forEach(item => console.log(item)) 

Rappelez-vous que pour interrompre un tel cycle, il est nécessaire de lever une exception, c'est-à-dire que si vous devez l'interrompre lors de l'utilisation d'un cycle, il est préférable de choisir un autre cycle.

▍ Faire ... en boucle


C'est ce qu'on appelle le «cycle de postcondition». Une telle boucle sera exécutée au moins une fois avant de vérifier la condition de fin de la boucle.

 const list = ['a', 'b', 'c'] let i = 0 do { console.log(list[i]) // console.log(i) // i = i + 1 } while (i < list.length) 

Il peut être interrompu à l'aide de la commande break , vous pouvez passer à sa prochaine itération avec la commande continue .

▍ en boucle


C'est ce que l'on appelle le «cycle préconditionné». Si, à l'entrée du cycle, la condition de poursuite du cycle est fausse, elle ne sera pas exécutée une seule fois.

 const list = ['a', 'b', 'c'] let i = 0 while (i < list.length) { console.log(list[i]) // console.log(i) // i = i + 1 } 

▍ pour ... en boucle


Cette boucle vous permet d'itérer sur toutes les propriétés énumérées d'un objet par leurs noms.

 let object = {a: 1, b: 2, c: 'three'} for (let property in object) { console.log(property) //  console.log(object[property]) //  } 

▍ Cycle pour ... de


Le cycle for...of combine la commodité du cycle forEach et la possibilité d'interrompre son fonctionnement à l'aide d'outils ordinaires.

 //  for (const value of ['a', 'b', 'c']) { console.log(value) // } //       `entries()` for (const [index, value] of ['a', 'b', 'c'].entries()) { console.log(index) // console.log(value) // } 

Notez qu'ici, dans l'en-tête de la boucle, le mot clé const est utilisé et non, comme vous vous en doutez, let . Si les variables à l'intérieur du bloc de boucle n'ont pas besoin d'être réaffectées, alors const nous convient tout à fait.
Si nous comparons les boucles for...in et for...of , il s'avère que for...in répète les noms des propriétés et for...of - les valeurs des propriétés.

Boucles et étendues


Avec les boucles et les étendues variables, il existe une fonction JavaScript qui peut poser des problèmes au développeur. Pour résoudre ces problèmes, let boucles, des étendues et des mots let clés var et let .

Prenons un exemple.

 const operations = [] for (var i = 0; i < 5; i++) { operations.push(() => {   console.log(i) }) } for (const operation of operations) { operation() } 

La boucle effectue 5 itérations, à chacune desquelles une nouvelle fonction est ajoutée au tableau d' operations . Cette fonction affiche dans la console la valeur du compteur de boucle - i . Une fois les fonctions ajoutées au tableau, nous parcourons ce tableau et appelons les fonctions qui en sont les éléments.

En exécutant un tel code, vous pouvez vous attendre au résultat affiché ci-dessous.

 0 1 2 3 4 

Mais en fait, il déduit ce qui suit.

 5 5 5 5 5 

Pourquoi en est-il ainsi? Le fait est qu'en tant que compteur de boucles, nous utilisons une variable déclarée à l'aide du mot clé var .

Étant donné que les déclarations de ces variables remontent en haut de la portée, le code ci-dessus est similaire au suivant.

 var i; const operations = [] for (i = 0; i < 5; i++) { operations.push(() => {   console.log(i) }) } for (const operation of operations) { operation() } 

En conséquence, il s'avère que dans la boucle for...of , dans laquelle nous itérons sur le tableau, la variable i est toujours visible, elle est 5, par conséquent, en se référant à i dans toutes les fonctions, nous imprimons le nombre 5.

Comment changer le comportement du programme pour qu'il fasse ce qu'on attend de lui?

La solution la plus simple à ce problème consiste à utiliser le mot clé let . Il, comme nous l'avons déjà dit, est apparu dans ES6, son utilisation vous permet de vous débarrasser de certaines bizarreries caractéristiques de var .

En particulier, dans l'exemple ci-dessus, il suffit de changer var pour let et tout fonctionnera comme il se doit.

 const operations = [] for (let i = 0; i < 5; i++) { operations.push(() => {   console.log(i) }) } for (const operation of operations) { operation() } 

Maintenant, à chaque itération de la boucle, chaque fonction ajoutée au tableau d' operations obtient sa propre copie de i . N'oubliez pas que dans cette situation, vous ne pouvez pas utiliser le mot clé const , car la valeur de i dans la boucle change.

Une autre façon de résoudre ce problème, qui était souvent utilisé avant la norme ES6, lorsque le mot clé let n'était pas là, était d'utiliser IIFE.

Avec cette approche, la valeur de i stockée dans la fermeture, et la fonction renvoyée par IIFE et ayant accès à la fermeture entre dans le tableau. Cette fonction peut être exécutée lorsqu'elle devient nécessaire. Voici à quoi ça ressemble.

 const operations = [] for (var i = 0; i < 5; i++) { operations.push(((j) => {   return () => console.log(j) })(i)) } for (const operation of operations) { operation() } 

Résumé


Aujourd'hui, nous avons parlé des tableaux et des boucles en JavaScript. Le sujet de notre prochain article est la gestion des exceptions, les modèles d'utilisation des points-virgules et les littéraux de modèle.

Chers lecteurs! Quelles méthodes de travail avec les tableaux en JavaScript utilisez-vous le plus souvent?

Source: https://habr.com/ru/post/fr430380/


All Articles