|
27 | 27 | ```js run |
28 | 28 | let map = new Map(); |
29 | 29 |
|
30 | | -map.set("1", "str1"); //строка в качестве ключа |
31 | | -map.set(1, "num1"); //цифра как ключ |
32 | | -map.set(true, "bool1"); //булево значение как ключ |
| 30 | +map.set("1", "str1"); // строка в качестве ключа |
| 31 | +map.set(1, "num1"); // цифра как ключ |
| 32 | +map.set(true, "bool1"); // булево значение как ключ |
33 | 33 |
|
34 | 34 | // помните, обычный объект Object приводит ключи к строкам? |
35 | 35 | // Map сохраняет тип ключей, так что в этом случае сохранится 2 разных значения: |
@@ -92,36 +92,6 @@ map.set("1", "str1") |
92 | 92 | ``` |
93 | 93 | ```` |
94 | 94 |
|
95 | | -## Создание Map из Object |
96 | | -
|
97 | | -При создании `Map` мы можем указать массив (или другой итерируемый объект) с парами ключ-значение для инициализации, как здесь: |
98 | | -
|
99 | | -```js |
100 | | -// массив пар [ключ, значение] |
101 | | -let map = new Map([ |
102 | | - ["1", "str1"], |
103 | | - [1, "num1"], |
104 | | - [true, "bool1"] |
105 | | -]); |
106 | | -``` |
107 | | -
|
108 | | -Если у нас уже есть обычный объект, и мы хотели бы создать `Map` из него, то поможет встроенный метод [Object.entries(obj)](mdn:js/Object/entries), который получает объект и возвращает массив пар ключ-значение для него, как раз в этом формате. |
109 | | -
|
110 | | -Так что мы можем создать `Map` из обычного объекта следующим образом: |
111 | | -
|
112 | | -```js |
113 | | -let obj = { |
114 | | - name: "John", |
115 | | - age: 30 |
116 | | -}; |
117 | | -
|
118 | | -*!* |
119 | | -let map = new Map(Object.entries(obj)); |
120 | | -*/!* |
121 | | -``` |
122 | | -
|
123 | | -Здесь `Object.entries` возвращает массив пар ключ-значение: `[ ["name","John"], ["age", 30] ]`. Это именно то, что нужно для создания `Map`. |
124 | | -
|
125 | 95 | ## Перебор Map |
126 | 96 |
|
127 | 97 | Для перебора коллекциии `Map` есть 3 метода: |
@@ -168,6 +138,89 @@ recipeMap.forEach((value, key, map) => { |
168 | 138 | }); |
169 | 139 | ``` |
170 | 140 |
|
| 141 | +## Object.entries: Map из Object |
| 142 | +
|
| 143 | +При создании `Map` мы можем указать массив (или другой итерируемый объект) с парами ключ-значение для инициализации, как здесь: |
| 144 | +
|
| 145 | +```js run |
| 146 | +// массив пар [ключ, значение] |
| 147 | +let map = new Map([ |
| 148 | + ['1', 'str1'], |
| 149 | + [1, 'num1'], |
| 150 | + [true, 'bool1'] |
| 151 | +]); |
| 152 | +
|
| 153 | +alert( map.get('1') ); // str1 |
| 154 | +``` |
| 155 | +
|
| 156 | +Если у нас уже есть обычный объект, и мы хотели бы создать `Map` из него, то поможет встроенный метод [Object.entries(obj)](mdn:js/Object/entries), который получает объект и возвращает массив пар ключ-значение для него, как раз в этом формате. |
| 157 | +
|
| 158 | +Так что мы можем создать `Map` из обычного объекта следующим образом: |
| 159 | +
|
| 160 | +```js |
| 161 | +let obj = { |
| 162 | + name: "John", |
| 163 | + age: 30 |
| 164 | +}; |
| 165 | +
|
| 166 | +*!* |
| 167 | +let map = new Map(Object.entries(obj)); |
| 168 | +*/!* |
| 169 | +``` |
| 170 | +
|
| 171 | +Здесь `Object.entries` возвращает массив пар ключ-значение: `[ ["name","John"], ["age", 30] ]`. Это именно то, что нужно для создания `Map`. |
| 172 | +
|
| 173 | +
|
| 174 | +## Object.fromEntries: Object из Map |
| 175 | +
|
| 176 | +Мы только что видели, как создать `Map` из обычного объекта при помощи `Object.entries(obj)`. |
| 177 | +
|
| 178 | +Есть метод `Object.fromEntries`, который делает противоположное: получив массив пар вида `[ключ, значение]`, он создаёт из них объект: |
| 179 | +
|
| 180 | +```js run |
| 181 | +let prices = Object.fromEntries([ |
| 182 | + ['banana', 1], |
| 183 | + ['orange', 2], |
| 184 | + ['meat', 4] |
| 185 | +]); |
| 186 | +
|
| 187 | +// now prices = { banana: 1, orange: 2, meat: 4 } |
| 188 | +
|
| 189 | +alert(prices.orange); // 2 |
| 190 | +``` |
| 191 | +
|
| 192 | +Мы можем использовать `Object.fromEntries`, чтобы получить обычный объект из `Map`. |
| 193 | +
|
| 194 | +К примеру, у нас данные в `Map`, но их нужно передать в сторонний код, который ожидает обычный объект. |
| 195 | +
|
| 196 | +Вот как это сделать: |
| 197 | +
|
| 198 | +```js run |
| 199 | +let map = new Map(); |
| 200 | +map.set('banana', 1); |
| 201 | +map.set('orange', 2); |
| 202 | +map.set('meat', 4); |
| 203 | +
|
| 204 | +*!* |
| 205 | +let obj = Object.fromEntries(map.entries()); // make a plain object (*) |
| 206 | +*/!* |
| 207 | +
|
| 208 | +// готово! |
| 209 | +// obj = { banana: 1, orange: 2, meat: 4 } |
| 210 | +
|
| 211 | +alert(obj.orange); // 2 |
| 212 | +``` |
| 213 | +
|
| 214 | +Вызов `map.entries()` возвращает массив пар ключ/значение, как раз в нужном формате для `Object.fromEntries`. |
| 215 | +
|
| 216 | +Мы могли бы написать строку `(*)` ещё короче: |
| 217 | +
|
| 218 | +```js |
| 219 | +let obj = Object.fromEntries(map); // убрать .entries() |
| 220 | +``` |
| 221 | +
|
| 222 | +Это то же самое, так как `Object.fromEntries` ожидает перебираемый объект в качестве аргумента, не обязательно массив. А перебор `map` как раз возвращает пары ключ/значение, так же, как и `map.entries()`. Так что в итоге у будет обычный объект с теми же ключами/значениями, что и в `map`. |
| 223 | +
|
171 | 224 | ## Set |
172 | 225 |
|
173 | 226 | Объект `Set` -- это особый вид коллекции: "множество" значений (без ключей), где каждое значение может появляться только один раз. |
|
0 commit comments