---
title: Itérer efficacement sur les tableaux en Javascript
description: "Analyse des performances de 3 méthodes d'itération sur les tableaux en Javascript.\npour (const of), forEach, for (let i), pour (let i), découvrez quelle méthode est la meilleure pour chaque situation."
image: https://blog.kuzzle.io/hubfs/Copie%20de%20featured%20image%20blog%20post%20hubspot_%20%20Bluebird%20vs%20Native%20vs%20Async_Await%20%20(1).png
---

<https://kuzzle.io/>

c'est ici qu'on rajoute le truc en français<-->

- [EN](https://kuzzle.io)
- [Github](https://github.com/kuzzleio)
- [Offre d'emploi](https://kuzzle.io/fr/a-propos/rejoignez-kuzzle/)
- [Nous Contacter](https://info.kuzzle.io/contacter-kuzzle?hsLang=fr)
- [Newsletter](https://info.kuzzle.io/inscription-a-notre-newsletter?hsLang=fr)
- [Blog FR](https://blog.kuzzle.io/fr/)
- [Télécharger](https://kuzzle.io/download)

- [Notre Vision](https://kuzzle.io/fr/a-propos/notre-vision/)
- [Kuzzle en 5 minutes](https://kuzzle.io/fr/a-propos/kuzzle-en-5-minutes/)
- [L'équipe](https://kuzzle.io/fr/a-propos/l-equipe/)
- [Rejoignez l'équipe Kuzzle](https://kuzzle.io/fr/a-propos/rejoignez-kuzzle/)
- [Espace Presse](https://kuzzle.io/fr/a-propos/presse/)

Suivez-nous

- <https://www.facebook.com/kuzzleio>
- <https://twitter.com/kuzzleio>
- <https://github.com/kuzzleio/kuzzle>

# Itérer efficacement sur les tableaux en Javascript

Par Alicia Thermos le 29 novembre 2019

En Javascript, les tableaux sont une des structures de données les plus utilisées.

[Read this article in english ](https://blog.kuzzle.io/efficiently-iterate-on-javascript-arrays?hsLang=fr)

 

Il est très fréquent de devoir itérer sur le contenu d’un tableau et cette opération peut se révéler coûteuse lorsque l’on manipule des tableaux de plusieurs milliers d’éléments.

 

Comme vous le savez, chez Kuzzle nous portons une attention particulière aux performances du code que nous développons pour nos produits et encore plus particulièrement dans les **"zones critiques de code"** qui peuvent être exécutées potentiellement **plusieurs centaines de fois par secondes**.

 

Dans cet article, nous allons voir les avantages et les inconvénients de 3 méthodes d’itération sur les tableaux.

 

**TLDR;**

- Utiliser *Array.forEach* dans les zones non-critiques de code
- Utiliser *for (let i; …; …)* dans les zones critiques de code

## Méthode 1: Array.forEach

La première méthode est d’utiliser la méthode [Array.forEach](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Array/forEach).

 

Cette méthode prend en paramètre une fonction qui sera appelée avec chaque élément du tableau.

 

```
array.forEach(item => {
  const foobar = item * 2;
});
```

 

En Node.js 12, cette méthode offre de très bonnes performances et son utilisation dans le coeur de Kuzzle est recommandée pour les itérations sur les tableaux de zones non-critiques de code.

## Méthode 2: for (const … of ...)

Une deuxième méthode repose sur les itérateurs de Javascript accessible grâce au symbole [Symbol.iterator](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Symbol/iterator).

 

*Si vous avez le temps, vous pouvez consulter le très bon article de Keith Cirkel sur les symboles:* [https://www.keithcirkel.co.uk/metaprogramming-in-es6-symbols/](https://www.keithcirkel.co.uk/metaprogramming-in-es6-symbols/)

 

Elle permet d’itérer sur tous les éléments d’un tableau avec une syntaxe agréable à lire et simple à comprendre.

 

```
for (const item of array2) {
  const foobar = item * 2;
}
```

 

Cette méthode est l’ancienne méthode préférée dans le coeur pour parcourir les tableaux car en Node.js 6, la méthode [Array.forEach](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Array/forEach) était assez lente.

 

Ce n’est plus le cas en Node.js 12 et donc l’utilisation de *for (const … of ...)* est dépréciée dans le coeur.

## Méthode 3: for (let i; …; ...)

Cette méthode parcours le tableau avec l’index de chaque élément.

Pour cela on utilise une boucle *for* et un nombre *i* représentant l’index de l’élément courant.

 

```
for (let i = 0; i < array.length; ++i) {
  const item = array[i];
 
  const foobar = item * 2;
}
```

 

C’est la méthode la plus rapide pour parcourir un tableau car c'est celle la plus proche de la syntax C++ qui est le langage utilisé par V8.

 

Cependant, elle rend le code plus complexe à comprendre ce qui a un impact sur la maintenabilité.

Elle n’est donc utilisée que dans les zones critiques de code.

## Benchmark et conclusion

Le benchmark de ces méthodes est réalisé avec Node.js 12.13.0 que nous utilisons par défaut dans le core de Kuzzle:

 

*$ node nodejs/loop-array.js*

*   for (let i) x            3,117,151 ops/sec ±0.66% (94 runs sampled)*

*   for (const of) x      817,769 ops/sec ±0.26% (98 runs sampled)*

*   Array.forEach x 2,297,760 ops/sec ±55.45% (93 runs sampled)*

*Fastest is while (for (let i))*

 

![](https://blog.kuzzle.io/hubfs/FR%20It%C3%A9rer%20efficacement%20sur%20les%20tableaux%20en%20Javascript.png)

 

 

Le benchmark des 3 méthodes précédentes est remporté par la la méthode ***for (let i; …; …)*** qui offre les meilleurs performances d’itération. Cependant du fait de sa complexité son usage est limité aux zones critiques de code uniquement.

 

Dans le reste du core de Kuzzle, nous utiliserons la méthode ***Array.forEach*** qui offre de bonnes performances et surtout une très bonne lisibilité du code.

 

Tout le code de ces benchmarks est disponible sur [Gist.](https://gist.github.com/Aschen/444466793b6780d373749064186c61cc)

## Bonus: Créer un tableau à partir d'un tableau

Ce benchmark n'est pas vraiment comparable aux autres car elle sert uniquement à créer un tableau à partir d'un autre tableau.

Cependant c'est un cas qui se produit assez souvent pour réaliser un benchmark.

 

On a vu ensemble que c'était la méthode ***for (let i; …; …)*** qui apportait les meilleurs performances lors du parcours d'un tableau.

 

Dans le cas précis de la construction d'un tableau à partir d'un autre tableau, c'est la méthode ***Array.map*** qui est la plus efficace.

 

*$ node loop-create-array.js*

*   foreach x             60,450 ops/sec ±8.91% (87 runs sampled)*  
*  for (const of) x 112,013 ops/sec ±1.97% (84 runs sampled)*  
*  for (let i) x        113,350 ops/sec ±2.63% (82 runs sampled)*  
*  map x               153,657 ops/sec ±4.45% (78 runs sampled)*  
*Fastest is map*

 

Voir le code du benchmark sur [Gist.](https://gist.github.com/Aschen/6225c7bc9c67313f9eeb3571964984e5)

 

- [Tweet](https://twitter.com/share)

![Alicia Thermos](https://app.hubspot.com/settings/avatar/47c07be51c528b59e92581e25bfcc712)

Par Alicia Thermos le 29 novembre 2019

### Postes associés

 Qu'est-ce que Kuzzle ?

 Kuzzle est un backend sécurisé, évolutif, entièrement personnalisable et open-source.  
 Il dispose également d'une console d'administration, de notifications en temps réel, de fonctions de géofencing et d'un moteur de recherche rapide. 

[Prise en main](https://info.kuzzle.io/start-with-kuzzle?hsLang=fr)

Une question? [C'est ici](https://gitter.im/kuzzleio/kuzzle)

Vous avez un projet? [Demandez une démo](https://info.kuzzle.io/demandez-une-demo?hsLang=fr)

[![cta-discover-kuzzle-fr](https://no-cache.hubspot.com/cta/default/3803374/82d4c883-8082-4587-92e3-09c146d13bc2.png)](https://cta-redirect.hubspot.com/cta/redirect/3803374/82d4c883-8082-4587-92e3-09c146d13bc2)

[![cta-dive-in-kuzzle-fr](https://no-cache.hubspot.com/cta/default/3803374/f426ae55-8332-440b-a5ac-7a13afb52ac3.png)](https://cta-redirect.hubspot.com/cta/redirect/3803374/f426ae55-8332-440b-a5ac-7a13afb52ac3)

### categories

- [Bâtiments intelligents (4)](https://blog.kuzzle.io/fr/tag/bâtiments-intelligents)
- [Jumeaux numériques (5)](https://blog.kuzzle.io/fr/tag/jumeaux-numériques)
- [Kuzzle (8)](https://blog.kuzzle.io/fr/tag/kuzzle)
- [Logistique et transport (1)](https://blog.kuzzle.io/fr/tag/logistique-et-transport)
- [Plateforme IoT (12)](https://blog.kuzzle.io/fr/tag/plateforme-iot)
- [Territoires connectés (4)](https://blog.kuzzle.io/fr/tag/territoires-connectés)

### Derniers posts

### Inscription

Veuillez remplir le formulaire ci-dessous pour vous abonner à notre blog

[Abonnez-vous à notre flux RSS](https://blog.kuzzle.io/fr/rss.xml)

[Tweets by kuzzleio](https://twitter.com/kuzzleio?ref_src=twsrc%5Etfw)

[PRODUITS](https://kuzzle.io/fr/) [![DEMANDER UNE DEMO IOT](https://no-cache.hubspot.com/cta/default/3803374/b06c7be7-0b3d-47ed-bcbc-9d9ac5b63b77.png)](https://kuzzle.io/fr/kuzzle-iot-plateforme-open-source/demo-kuzzke-iot/?hsCtaTracking=b71c079c-26bb-4aa4-ab8d-09e9d93d52e5%7C7456984a-b366-4fec-b69c-57feff222eb5)

PRODUITS KUZZLE

[Kuzzle Backend](https://kuzzle.io/fr/kuzzle-backend/)

[Kuzzle IoT](https://kuzzle.io/fr/kuzzle-iot-plateforme-open-source/)

FONCTIONNALITES PRETES A L'EMPLOI

[Securite & Authentification des utilisateurs](https://kuzzle.io/fr/kuzzle-backend/)

[Base de données en temps réel](https://kuzzle.io/fr/kuzzle-backend/)

[Geolocalisation en temps réel](https://kuzzle.io/fr/kuzzle-backend/)

[Moteur Pub/Sub en temps réel](https://kuzzle.io/fr/kuzzle-backend/)

[Kuzzle Admin Console](https://kuzzle.io/fr/kuzzle-backend/)

[Installable On Premise & Cloud Agnostic](https://kuzzle.io/fr/kuzzle-backend/)

[CAS CLIENTS](https://kuzzle.io/fr/cas-clients/)

[Smart Cities](https://kuzzle.io/fr/cas-clients/)

[Smart Building](https://kuzzle.io/fr/cas-clients/)

[Smart Industrie](https://kuzzle.io/fr/cas-clients/)

[Smart Logistique](https://kuzzle.io/fr/cas-clients/)

[TARIFS](https://kuzzle.io/fr/tarifs/)

[Nos tarifs](https://kuzzle.io/fr/tarifs/)

[DÉVELOPPEURS](https://docs.kuzzle.io) [![Télécharger Kuzzle](https://no-cache.hubspot.com/cta/default/3803374/9230fbb8-1602-40d6-b5e9-7395705251de.png)](https://cta-redirect.hubspot.com/cta/redirect/3803374/9230fbb8-1602-40d6-b5e9-7395705251de)

GUIDES

[Getting Started](https://docs.kuzzle.io/guide/getting-started)

[Essentials](https://docs.kuzzle.io/guide/essentials)

[Kuzzle in Depth](https://docs.kuzzle.io/guide/kuzzle-depth)

DOCUMENTATION

[SDK Reference](https://docs.kuzzle.io/sdk-reference/kuzzle)

[Koncorde](https://docs.kuzzle.io/core/1/guides/cookbooks/realtime-api/introduction/)

[API Documentation](https://docs.kuzzle.io/core/1/api/essentials/connecting-to-kuzzle/)

[Plugin Reference](https://docs.kuzzle.io/plugins/1/essentials/getting-started/)

[Elasticsearch Cookbook](https://docs.kuzzle.io/guide/1/elasticsearch/introduction/)

COMMUNAUTÉ

[Github](https://github.com/kuzzleio/kuzzle)

[Discord](https://discord.gg/tAEtyDZ)

[ENTREPRISE](https://kuzzle.io/company/) [![Inscription à notre newsletter](https://no-cache.hubspot.com/cta/default/3803374/63a23e8f-3fe5-476a-bb0e-b6f94bd3ac7a.png)](https://kuzzle.io/fr/newsletter/)

À PROPOS

[Qui sommes-nous](https://kuzzle.io/fr/qui-sommes-nous/)

[Rejoignez l'équipe](https://kuzzle.io/fr/qui-sommes-nous/recrutement/)

[Méthodes de travail](https://kuzzle.io/fr/company/methodes-de-travail/)

[Presse](https://kuzzle.io/fr/qui-sommes-nous/espace-presse/)

[Partenaires](https://kuzzle.io/fr/qui-sommes-nous/espace-partenaire/)

[Nous contacter](https://kuzzle.io/fr/nous-contacter/)

SUIVEZ-NOUS

[Twitter](https://twitter.com/kuzzleio)

[Facebook](https://www.facebook.com/kuzzleio)

[Github](https://github.com/kuzzleio)

[Linkedin](https://www.linkedin.com/company/kuzzle/)

[Youtube](https://www.youtube.com/channel/UCHcEzVQoH10YSyxc7jD3SMw)

- [Politique de confidentialité](https://kuzzle.io/privacy-policy)

©2021 KUZZLE - Tous droits réservés