WikiSort.ru - Не сортированное

ПОИСК ПО САЙТУ | о проекте

Типы коллекций в JavaScript:

  • Set
  • Map
  • WeakSet
  • WeakMap.

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 .




Текст в блоке "Читать" взят с сайта "Википедия" и доступен по лицензии Creative Commons Attribution-ShareAlike; в отдельных случаях могут действовать дополнительные условия.

Другой контент может иметь иную лицензию. Перед использованием материалов сайта WikiSort.ru внимательно изучите правила лицензирования конкретных элементов наполнения сайта.

2019-2025
WikiSort.ru - проект по пересортировке и дополнению контента Википедии