Итерация
Для итерации по map используется один из трёх методов:
map.keys() – возвращает итерируемый объект для ключей,
map.values() – возвращает итерируемый объект для значений,
map.entries() – возвращает итерируемый объект для записей [ключ, значение] , он используется по умолчанию в for..of .
Например:
'use strict';
let recipeMap = new Map([ ['огурцов', '500 гр'],
['помидоров', '350 гр'],
['сметаны', '50 гр']
]);
// цикл по ключам
for(let fruit of recipeMap.keys()) { alert(fruit); // огурцов, помидоров, сметаны
}
// цикл по значениям [ключ,значение] for(let amount of recipeMap.values()) {
alert(amount); // 500 гр, 350 гр, 50 гр
}
// цикл по записям
for(let entry of recipeMap) { // то же что и recipeMap.entries() alert(entry); // огурцов,500 гр , и т.д., массивы по 2 значения
}
Кроме того, у Map есть стандартный метод forEach , аналогичный массиву:
'use strict';
let recipeMap = new Map([ ['огурцов', '500 гр'],
['помидоров', '350 гр'],
['сметаны', '50 гр']
]);
recipeMap.forEach( (value, key, map) => { alert(`${key}: ${value}`); // огурцов: 500 гр, и т.д.
});
Set
Set – коллекция для хранения множества значений, причём каждое значение может встречаться лишь один раз.
Например, к нам приходят посетители, и мы хотели бы сохранять всех, кто пришёл. При этом повторные визиты не должны приводить к дубликатам, то есть каждого посетителя нужно «посчитать» ровно один раз.
Set для этого отлично подходит:
'use strict';
let set = new Set();
let vasya = {name: "Вася"}; let petya = {name: "Петя"}; let dasha = {name: "Даша"};
// посещения, некоторые пользователи заходят много раз set.add(vasya);
set.add(petya); set.add(dasha); set.add(vasya); set.add(petya);
// set сохраняет только уникальные значения alert( set.size ); // 3
set.forEach( user => alert(user.name ) ); // Вася, Петя, Даша
В примере выше многократные добавления одного и того же объекта в set не создают лишних копий.
Альтернатива Set – это массивы с поиском дубликата при каждом добавлении, но они гораздо хуже по производительности. Или можно использовать обычные объекты, где в качестве ключа выступает какой‑нибудь уникальный идентификатор посетителя. Но это менее удобно, чем простой и наглядный Set .
Основные методы:
set.add(item) – добавляет в коллекцию item , возвращает set (чейнится).
set.delete(item) – удаляет item из коллекции, возвращает true , если он там был, иначе false .
set.has(item) – возвращает true , если item есть в коллекции, иначе false .
set.clear() – очищает set .
Перебор Set осуществляется через forEach или for..of аналогично Map :
'use strict';
let set = new Set(["апельсины", "яблоки", "бананы"]);
// то же, что: for(let value of set) set.forEach((value, valueAgain, set) => {
alert(value); // апельсины, затем яблоки, затем бананы
});
Заметим, что в Set у функции в .forEach три аргумента: значение, ещё раз значение, и затем сам перебираемый объект set . При этом значение повторяется в аргументах два раза.
Так сделано для совместимости с Map , где у .forEach ‑функции также три аргумента. Но в Set первые два всегда совпадают и содержат очередное значение множества.
Do'stlaringiz bilan baham: |