Типы коллекций в JavaScript:
1. Map
– коллекция для хранения записей вида ключ:значение. В отличие от объектов, в которых ключами могут быть только строки, в Map ключом может быть произвольное значение, например:
1 'use strict';
2
3 let map = new Map();
4
5 map.set('1', 'str1'); // ключ-строка
6 map.set(1, 'num1'); // число
7 map.set(true, 'bool1'); // булевое значение
Для сохранения и чтения значений используются методы get ()
и set ()
. И ключи и значения сохраняются «как есть», без преобразований типов.
1 console.log( map.get(1) ); // 'num1'
2 console.log( map.get('1') ); // 'str1'
Метод set
можно чейнить
1 map
2 .set('1', 'str1')
3 .set(1, 'num1')
4 .set(true, 'bool1');
Как видно из примера выше, свойство map.size
хранит общее количество записей в map.
1 'use strict';
2
3 let map = new Map();
4
5 map.set('1', 'str1'); // ключ-строка
6 map.set(1, 'num1'); // число
7 map.set(true, 'bool1'); // булевое значение
8
9 console.log( map.size ); // 3
В качестве ключей map
можно использовать и объекты:
1 'use strict';
2
3 let user = { name: "Игорь" };
4
5 // для каждого пользователя будем хранить количество посещений
6 let visitsCountMap = new Map();
7
8 // объект user является ключом в visitsCountMap
9 visitsCountMap.set(user, 190);
10
11 console.log( visitsCountMap.get(user) ); // 190
При создании Map
можно сразу инициализировать списком значений.
Объект map
с тремя ключами, как и в примере выше:
1 'use strict';
2
3 let map = new Map([
4 ['1', 'str1'],
5 [1, 'num1'],
6 [true, 'bool1']
7 ]);
8
9 console.log(map);
Для итерации по map
используется один из трёх методов:
map.keys()
– возвращает итерируемый объект для ключейmap.values()
– возвращает итерируемый объект для значенийmap.entries()
– возвращает итерируемый объект для записей [ключ, значение], он используется по умолчанию в for..of. 1 'use strict';
2
3 let recipeMap = new Map([
4 ['клубника', '500 гр'],
5 ['вишня', '350 гр'],
6 ['сметаны', '50 гр']
7 ]);
8
9 //цикл по ключам
10 for(let fruit of recipeMap.keys()) {
11 console.log(fruit); // клубники, вишни, сметаны
12 }
13 //цикл по значениям
14 for(let amount of recipeMap.values()) {
15 console.log(amount); // 500 гр, 350 гр, 50 гр
16 }
17 //цикл по записям
18 for(let entries of recipeMap) {
19 console.log(entries); // клубника,500 гр , вишня,350 гр. , сметаны, 50 гр.
20 }
Set
– коллекция для хранения множества значений, причём каждое значение может встречаться лишь один раз.Пример:
Нам нужно накормить домашних животных, и мы хотели бы сохранять(запомнить) всех, кого накормили. При этом повторные "давание пищи" не должны приводить к дубликатам, то есть каждого животного нужно «посчитать» ровно один раз.
1 'use strict';
2
3 let set = new Set();
4
5 let murchik = {name: "Мурчик"};
6 let saymon = {name: "Саймон"};
7 let sofia = {name: "Софа"};
8
9 // кормление, некоторые животный едят много раз
10 set.add(murchik);
11 set.add(saymon);
12 set.add(sofia);
13 set.add(murchik);
14 set.add(saymon);
15
16 // set сохраняет только уникальные значения
17 console.log( set.size ); // 3
18
19 set.forEach( user => console.log(user.name ) ); // Мурчик, Саймон, Софа
Перебор Set
осуществляется через forEach
или for..of
аналогично Map
:
1 'use strict';
2
3 let set = new Set(["Англия", "Франция", "Италия"]);
4
5 // то же, что: for(let value of set)
6 set.forEach((value, valueAgain, set) => {
7 console.log(value); // Англия затем Франция и затем Италия
8 });
WeakMap и WeakSet
WeakSet
– особый вид Set
не препятствующий сборщику мусора удалять свои элементы. То же самое – WeakMap
для Map
.(Если какой-то объект присутствует только в WeakSet/WeakMap
– он удаляется из памяти.)
Если поместить такие данные в WeakMap
, а объект сделать ключом, то они будут автоматически удалены из памяти, когда удалится элемент.
1 'use strict';
2 // ингредиенты в наличии
3 let activeIngr = [
4 {name: "Мороженное"},
5 {name: "Банан"},
6 {name: "Шоколад"}
7 ];
8
9 // и потому хранится отдельно
10 let weakMap = new WeakMap();
11
12 weakMap.set(activeIngr[0], 1);
13 weakMap.set(activeIngr[1], 2);
14 weakMap.set(activeIngr[2], 3);
15
16 console.log( weakMap.get(activeIngr[0]) ); // 1
17
18 activeIngr.splice(0, 1); // Мороженное сьеденно
19
20
21 activeIngr.splice(0, 1); // Банан сьеден
22
23 // weakMap теперь содержит только 1 элемент
WeakMap
и WeakSet
специфицированы вести себя так же как Map
и Set
, но со следующими ограничениями:
WeakMap
поддерживает только new, .has(), .get(), .set(), .delete()
.WeakSet
поддерживает только new, .has(), .add(), .delete()
.WeakSet
и ключи в WeakMap
должны быть объектами.![]() | Список значений слова или словосочетания со ссылками на соответствующие статьи. Если вы попали сюда из текста другой статьи Википедии, пожалуйста, вернитесь и уточните ссылку так, чтобы она указывала на нужную статью. |
Данная страница на сайте WikiSort.ru содержит текст со страницы сайта "Википедия".
Если Вы хотите её отредактировать, то можете сделать это на странице редактирования в Википедии.
Если сделанные Вами правки не будут кем-нибудь удалены, то через несколько дней они появятся на сайте WikiSort.ru .