You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Now we've learned about the following complex data structures:
4
+
Nous avons découvert les structures de données complexes suivantes :
5
5
6
-
- Objects for storing keyed collections.
7
-
- Arrays for storing ordered collections.
6
+
- Objects (les objets) pour stocker des valeurs par clés.
7
+
- Arrays (les tableaux) pour stocker des valeurs en conservant l'ordre d'insertion.
8
+
9
+
Il existe aussi `Map` (les dictionnaires de données) et `Set` (les ensembles) qui sont très utiles dans notre quotidien de développeur.
8
10
9
-
But that's not enough for real life. That's why `Map` and `Set` also exist.
10
11
11
12
## Map
12
13
13
-
[Map](mdn:js/Map)is a collection of keyed data items, just like an`Object`. But the main difference is that `Map` allows keys of any type.
14
+
Une [Map](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Map)(dictionnaire de donnée) permet, comme pour un`Object`, de stocker plusieurs éléments sous la forme de clés valeurs. Sauf que cette fois, les clés peuvent être de n'importe qu'elle type.
14
15
15
-
Methods and properties are:
16
+
Voici les méthodes et les propriétés d'une `Map`:
16
17
17
-
-`new Map()` -- creates the map.
18
-
-`map.set(key, value)` -- stores the value by the key.
19
-
-`map.get(key)` -- returns the value by the key, `undefined`if`key`doesn't exist in map.
20
-
-`map.has(key)` -- returns`true`if the `key`exists, `false` otherwise.
21
-
-`map.delete(key)` -- removes the value by the key.
22
-
-`map.clear()` -- removes everything from the map.
23
-
-`map.size` -- returns the current element count.
18
+
-`new Map()` -- instancie la map.
19
+
-`map.set(key, value)` -- définie la valeur pour une clé.
20
+
-`map.get(key)` -- retourne la valeur associée à la clé, `undefined`si`key`n'existe pas dans la map.
`visitsCountObj` est un objet, de ce fait, toutes les clés, comme `john`, sont transformées en chaîne de caractères.
82
+
C'est pourquoi nous obtenons comme valeur de clé `"[object Object]"`. Ce n'est clairement pas ce que l'on souhaite.
76
83
77
-
As `visitsCountObj` is an object, it converts all keys, such as `john` to strings, so we've got the string key `"[object Object]"`. Definitely not what we want.
84
+
```smart header="Comment `Map` compare les clés"
78
85
79
-
```smart header="How `Map` compares keys"
80
-
To test keys for equivalence, `Map` uses the algorithm [SameValueZero](https://tc39.github.io/ecma262/#sec-samevaluezero). It is roughly the same as strict equality `===`, but the difference is that `NaN` is considered equal to `NaN`. So `NaN` can be used as the key as well.
86
+
Pour tester l'égalité entre les clés, `Map` se base sur l'algorithme [SameValueZero](https://tc39.github.io/ecma262/#sec-samevaluezero).
87
+
C'est grosso modo la même chose que l'opérateur de stricte égalité `===`, à la différence que `NaN` est considéré comme étant égal à `NaN`.
88
+
`NaN` peut donc être utilisé comme clé.
81
89
82
-
This algorithm can't be changed or customized.
90
+
Cet algorithme ne peut pas peut être modifié.
83
91
```
84
92
85
93
````smart header="Chaining"
86
-
Every `map.set` call returns the map itself, so we can "chain" the calls:
94
+
95
+
Chaque appel à `map.set` retourne la map elle-même, ce qui nous permet d'enchaîner les appels:
87
96
88
97
```js
89
98
map.set('1', 'str1')
@@ -92,22 +101,23 @@ map.set('1', 'str1')
92
101
```
93
102
````
94
103
95
-
## Map from Object
104
+
## Map depuis Object
96
105
97
-
When a `Map` is created, we can pass an array (or another iterable) with key-value pairs for initialization, like this:
106
+
Lorsqu'une `Map` est créée, nous pouvons utiliser un tableau (ou n'importe quel `iterable`) qui possède un couple clé-valeur.
98
107
108
+
Par exemple :
99
109
```js
100
-
// array of [key, value] pairs
110
+
// un tableau avec couple [clé, valeur]
101
111
let map = new Map([
102
112
['1', 'str1'],
103
113
[1, 'num1'],
104
114
[true, 'bool1']
105
115
]);
106
116
```
107
117
108
-
If we have a plain object, and we'd like to create a `Map` from it, then we can use built-in method [Object.entries(obj)](mdn:js/Object/entries) that returns an array of key/value pairs for an object exactly in that format.
118
+
Si nous voulons créer une `Map` à partir d'un `Object`, nous pouvons utiliser la méthode [Object.entries(obj)](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Object/entries) qui retourne un tableau de couple clé/valeur pour un objet qui respectent ce format.
109
119
110
-
So we can initialize a map from an object like this:
120
+
Nous pouvons donc initialiser une `Map` à partir d'un objet de la manière suivante :
111
121
112
122
```js
113
123
let obj = {
@@ -120,17 +130,17 @@ let map = new Map(Object.entries(obj));
120
130
*/!*
121
131
```
122
132
123
-
Here, `Object.entries` returns the array of key/value pairs: `[ ["name","John"], ["age", 30] ]`. That's what `Map` needs.
133
+
`Object.entries` retourne le tableau de couple clé/valeur `[ ["name","John"], ["age", 30] ]` que nous pouvons utiliser pour créer notre `Map`.
124
134
125
-
## Iteration over Map
135
+
## Parcourir les éléments d'une `Map`
126
136
127
-
For looping over a `map`, there are 3 methods:
137
+
Il existe 3 façons de parcourir les éléments d'une `map` :
128
138
129
-
- `map.keys()` -- returns an iterable for keys,
130
-
- `map.values()` -- returns an iterable for values,
131
-
- `map.entries()` -- returns an iterable for entries `[key, value]`, it's used by default in `for..of`.
139
+
- `map.keys()` -- retourne toutes les clés sous forme d'`iterable`,
140
+
- `map.values()` -- retourne les valeurs sous forme d'`iterable`,
141
+
- `map.entries()` -- retourne les `entries` (couple sous forme de `[clé, valeur]`), c'est la méthode utilisée par défaut par `for..of`.
132
142
133
-
For instance:
143
+
Par exemple :
134
144
135
145
```js run
136
146
let recipeMap = new Map([
@@ -139,53 +149,54 @@ let recipeMap = new Map([
139
149
['onion', 50]
140
150
]);
141
151
142
-
// iterate over keys (vegetables)
152
+
// on parcourt les clés (les légumes)
143
153
for (let vegetable of recipeMap.keys()) {
144
154
alert(vegetable); // cucumber, tomatoes, onion
145
155
}
146
156
147
-
// iterate over values (amounts)
157
+
// on parcourt les valeurs (les montants)
148
158
for (let amount of recipeMap.values()) {
149
159
alert(amount); // 500, 350, 50
150
160
}
151
161
152
-
// iterate over [key, value] entries
153
-
for (let entry of recipeMap) { // the same as of recipeMap.entries()
154
-
alert(entry); // cucumber,500 (and so on)
162
+
// on parcourt les entries (couple [clé, valeur])
163
+
for (let entry of recipeMap) { // équivalent à : recipeMap.entries()
164
+
alert(entry); // cucumber,500 (etc...)
155
165
}
156
166
```
157
167
158
-
```smart header="The insertion order is used"
159
-
The iteration goes in the same order as the values were inserted. `Map` preserves this order, unlike a regular `Object`.
168
+
```smart header="L'ordre d'insertion est conservé"
169
+
Contraitement aux `Object`, `Map` conserve l'ordre d'insertion des valeurs.
160
170
```
161
171
162
-
Besides that, `Map` has a built-in `forEach` method, similar to `Array`:
172
+
Il est aussi possible d'utiliser `forEach` avec `Map` comme on pourrait le faire avec un tableau :
163
173
164
174
```js
165
-
// runs the function for each (key, value) pair
175
+
// exécute la fonction pour chaque couple (key, value)
166
176
recipeMap.forEach( (value, key, map) => {
167
177
alert(`${key}: ${value}`); // cucumber: 500 etc
168
178
});
169
179
```
170
180
171
181
## Set
172
182
173
-
A `Set` is a special type collection - "set of values" (without keys), where each value may occur only once.
183
+
`Set` est une liste sans doublons.
174
184
175
-
Its main methods are:
185
+
Ses principales méthodes sont :
176
186
177
-
- `new Set(iterable)` -- creates the set, and if an `iterable` object is provided (usually an array), copies values from it into the set.
178
-
- `set.add(value)` -- adds a value, returns the set itself.
179
-
- `set.delete(value)` -- removes the value, returns `true` if `value` existed at the moment of the call, otherwise `false`.
180
-
- `set.has(value)` -- returns `true` if the value exists in the set, otherwise `false`.
181
-
- `set.clear()` -- removes everything from the set.
182
-
- `set.size` -- is the elements count.
187
+
- `new Set(iterable)` -- créé un `set`, si un `iterable` (la plupart du temps, un tableau) est passé en paramètre, ses valeurs sont copiées dans le `set`
188
+
- `set.add(value)` -- ajoute l'élément `value` et retourne le `set`.
189
+
- `set.delete(value)` -- supprime l'élément `value` et retourne `true` si la valeur existait au moment de l'appel sinon `false`.
190
+
- `set.has(value)` -- retourne `true` si la valeur existe dans le `set`, sinon faux.
191
+
- `set.clear()` -- supprime tout le contenu du `set`.
192
+
- `set.size` -- le nombre d'éléments dans le tableau.
183
193
184
-
The main feature is that repeated calls of `set.add(value)` with the same value don't do anything. That's the reason why each value appears in a `Set` only once.
194
+
Ce qu'il faut surtout savoir c'est que lorsque l'on appelle plusieurs fois `set.add(value)` avec la même valeur, la méthode ne fait rien.
195
+
C'est pourquoi chaque valeur est unique dans un `Set`.
185
196
186
-
For example, we have visitors coming, and we'd like to remember everyone. But repeated visits should not lead to duplicates. A visitor must be "counted" only once.
197
+
Par exemple, nous souhaitons nous souvenir de tous nos visiteurs. Mais chaque visiteurs doit être unique.
187
198
188
-
`Set` is just the right thing for that:
199
+
`Set` est exactement ce qu'il nous faut :
189
200
190
201
```js run
191
202
let set = new Set();
@@ -194,76 +205,82 @@ let john = { name: "John" };
194
205
let pete = { name: "Pete" };
195
206
let mary = { name: "Mary" };
196
207
197
-
// visits, some users come multiple times
208
+
// visites, certains utilisateurs viennent plusieurs fois
198
209
set.add(john);
199
210
set.add(pete);
200
211
set.add(mary);
201
212
set.add(john);
202
213
set.add(mary);
203
214
204
-
// set keeps only unique values
215
+
// set conserve une fois chaque visiteurs
205
216
alert( set.size ); // 3
206
217
207
218
for (let user of set) {
208
-
alert(user.name); // John (then Pete and Mary)
219
+
alert(user.name); // John (puis Pete et Mary)
209
220
}
210
221
```
211
222
212
-
The alternative to `Set` could be an array of users, and the code to check for duplicates on every insertion using [arr.find](mdn:js/Array/find). But the performance would be much worse, because this method walks through the whole array checking every element. `Set` is much better optimized internally for uniqueness checks.
223
+
Nous aurions aussi pu utiliser un tableau (`Array`) en vérifiant avant chaque insertion que l'élément n'existe pas en utilisant
224
+
[arr.find](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Array/find). Cependant les performances auraient été
225
+
moins bonnes car cette méthode parcours chaque élément du tableau. `Set` est beaucoup plus efficace car il est optimisé en interne pour vérifier l'unicité des valeurs.
213
226
214
-
## Iteration over Set
227
+
## Parcourir un Set
215
228
216
-
We can loop over a set either with `for..of` or using `forEach`:
229
+
Nous pouvons parcourir les éléments d'un Set avec `for..of` ou en utilisant `forEach`
217
230
218
231
```js run
219
232
let set = new Set(["oranges", "apples", "bananas"]);
220
233
221
234
for (let value of set) alert(value);
222
235
223
-
// the same with forEach:
236
+
// même chose en utilisant forEach:
224
237
set.forEach((value, valueAgain, set) => {
225
238
alert(value);
226
239
});
227
240
```
228
241
229
-
Note the funny thing. The callback function passed in `forEach` has 3 arguments: a `value`, then *the same value* `valueAgain`, and then the target object. Indeed, the same value appears in the arguments twice.
242
+
A noter que la fonction de callback utilisée par `forEach` prend 3 arguments en paramètres: une `value`, puis *la même valeur* `valueAgain`,
243
+
et enfin le set lui-même.
244
+
230
245
231
-
That's for compatibility with `Map` where the callback passed `forEach` has three arguments. Looks a bit strange, for sure. But may help to replace `Map` with `Set` in certain cases with ease, and vice versa.
246
+
C'est pour des raisons de compatibilité avec `Map` que `forEach` prend en paramètre 3 arguments. C'est quelque peu surprenant, mais cela permet de
247
+
remplacer facilement une `Map` par un `Set`.
232
248
233
-
The same methods `Map` has for iterators are also supported:
249
+
Les méthodes pour parcourir les éléments d'une `Map` peuvent être utilisées :
234
250
235
-
- `set.keys()` -- returns an iterable object for values,
236
-
- `set.values()` -- same as `set.keys()`, for compatibility with `Map`,
237
-
- `set.entries()` -- returns an iterable object for entries `[value, value]`, exists for compatibility with `Map`.
251
+
- `set.keys()` -- retourne un objet iterable contenant les valeurs,
252
+
- `set.values()` -- même chose que pour `set.keys()`, méthode présente pour des raisons de compatibilité avec `Map`,
253
+
- `set.entries()` -- retourne un objet iterable sous la forme de `[value, value]`, , méthode présente pour des raisons de compatibilité avec `Map`
238
254
239
255
## Summary
240
256
241
-
`Map` -- is a collection of keyed values.
257
+
`Map` -- est une collection de clé valeurs.
242
258
243
-
Methods and properties:
259
+
Méthodes et propriétés:
244
260
245
-
- `new Map([iterable])` -- creates the map, with optional `iterable` (e.g. array) of `[key,value]` pairs for initialization.
246
-
- `map.set(key, value)` -- stores the value by the key.
247
-
- `map.get(key)` -- returns the value by the key, `undefined` if `key` doesn't exist in map.
248
-
- `map.has(key)` -- returns `true` if the `key` exists, `false` otherwise.
249
-
- `map.delete(key)` -- removes the value by the key.
250
-
- `map.clear()` -- removes everything from the map.
251
-
- `map.size` -- returns the current element count.
261
+
- `new Map([iterable])` -- créé une map, potentiellement initialisée avec un `iterable` (ex: un array) de couple clé valeur `[key,value]`.
262
+
- `map.set(key, value)` -- définie la valeur `value` pour la clé `key`.
263
+
- `map.get(key)` -- retourne la valeur associée à `key`, `undefined` si `key` n'existe pas.
264
+
- `map.has(key)` -- retourne `true` si `key` existe sinon `false`.
265
+
- `map.delete(key)` -- supprime la valeur associé à `key` dans la map.
266
+
- `map.clear()` -- supprime tous les éléments dans la map.
267
+
- `map.size` -- retourne le nombre d'éléments.
252
268
253
-
The differences from a regular `Object`:
269
+
La différence entre `Map` avec un objet traditionel :
254
270
255
-
- Any keys, objects can be keys.
256
-
- Additional convenient methods, the `size` property.
271
+
- N'importe quel type peut être utilisé comme clé
272
+
- Accès à des méthodes tels que `size`.
257
273
258
-
`Set` -- is a collection of unique values.
274
+
`Set` -- est une collection de valeurs uniques
259
275
260
-
Methods and properties:
276
+
Méthodes et propriétés :
261
277
262
-
- `new Set([iterable])` -- creates the set, with optional `iterable` (e.g. array) of values for initialization.
263
-
- `set.add(value)` -- adds a value (does nothing if `value` exists), returns the set itself.
264
-
- `set.delete(value)` -- removes the value, returns `true` if `value` existed at the moment of the call, otherwise `false`.
265
-
- `set.has(value)` -- returns `true` if the value exists in the set, otherwise `false`.
266
-
- `set.clear()` -- removes everything from the set.
267
-
- `set.size` -- is the elements count.
278
+
- `new Set([iterable])` -- créé un set, potentiellement initialisé avec un `iterable` (ex: un array) de valeurs.
279
+
- `set.add(value)` -- ajoute une valeur sauf si elle existe et retourne le set en cours.
280
+
- `set.delete(value)` -- supprime la valeur, retourne `true` si `value` existait au moment de l'appel sinon `false`.
281
+
- `set.has(value)` -- retourne `true` si la valeur existe dans le `set`, sinon `false`.
282
+
- `set.clear()` -- supprime tous les éléments du set.
283
+
- `set.size` -- retourne le nombre d'éléments.
268
284
269
-
Iteration over `Map` and `Set` is always in the insertion order, so we can't say that these collections are unordered, but we can't reorder elements or directly get an element by its number.
285
+
On ne peut pas dire que les éléments dans une `Map` ou un `Set` sont désordonnés car ils sont toujours parcourut par ordre d'insertion.
286
+
Il est cependant impossible de réorganiser les éléments ou bien de les retrouver par leur index.
0 commit comments