СейÑÐ°Ñ Ð¼Ñ Ð·Ð½Ð°ÐµÐ¼ о ÑледÑÑÑÐ¸Ñ ÑложнÑÑ ÑÑÑÑкÑÑÑÐ°Ñ Ð´Ð°Ð½Ð½ÑÑ :
- ÐбÑекÑÑ Ð´Ð»Ñ Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð½ÑÑ ÐºÐ¾Ð»Ð»ÐµÐºÑий.
- ÐаÑÑÐ¸Ð²Ñ Ð´Ð»Ñ Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ ÑпоÑÑдоÑеннÑÑ ÐºÐ¾Ð»Ð»ÐµÐºÑий.
Ðо ÑÑого не вÑегда доÑÑаÑоÑно Ð´Ð»Ñ ÑеÑÐµÐ½Ð¸Ñ Ð¿Ð¾Ð²ÑедневнÑÑ
задаÑ. ÐоÑÑÐ¾Ð¼Ñ Ñакже ÑÑÑеÑÑвÑÑÑ Map и Set.
Map
Map â ÑÑо коллекÑÐ¸Ñ ÐºÐ»ÑÑ/знаÑение, как и Object. Ðо оÑновное оÑлиÑие в Ñом, ÑÑо Map позволÑÐµÑ Ð¸ÑполÑзоваÑÑ ÐºÐ»ÑÑи лÑбого Ñипа.
ÐеÑÐ¾Ð´Ñ Ð¸ ÑвойÑÑва:
new Map()â ÑоздаÑÑ ÐºÐ¾Ð»Ð»ÐµÐºÑиÑ.map.set(key, value)â запиÑÑÐ²Ð°ÐµÑ Ð¿Ð¾ клÑÑÑkeyзнаÑениеvalue.map.get(key)â возвÑаÑÐ°ÐµÑ Ð·Ð½Ð°Ñение по клÑÑÑ Ð¸Ð»Ð¸undefined, еÑли клÑÑkeyоÑÑÑÑÑÑвÑеÑ.map.has(key)â возвÑаÑаеÑtrue, еÑли клÑÑkeyпÑиÑÑÑÑÑвÑÐµÑ Ð² коллекÑии, инаÑеfalse.map.delete(key)â ÑдалÑÐµÑ ÑÐ»ÐµÐ¼ÐµÐ½Ñ (паÑÑ Â«ÐºÐ»ÑÑ/знаÑение») по клÑÑÑkey.map.clear()â оÑиÑÐ°ÐµÑ ÐºÐ¾Ð»Ð»ÐµÐºÑÐ¸Ñ Ð¾Ñ Ð²ÑÐµÑ ÑлеменÑов.map.sizeâ возвÑаÑÐ°ÐµÑ ÑекÑÑее колиÑеÑÑво ÑлеменÑов.
ÐапÑимеÑ:
let map = new Map();
map.set("1", "str1"); // ÑÑÑока в каÑеÑÑве клÑÑа
map.set(1, "num1"); // ÑиÑÑа как клÑÑ
map.set(true, "bool1"); // бÑлево знаÑение как клÑÑ
// помниÑе, обÑÑнÑй обÑÐµÐºÑ Object пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ ÐºÐ»ÑÑи к ÑÑÑокам?
// Map ÑоÑ
ÑанÑÐµÑ Ñип клÑÑей, Ñак ÑÑо в ÑÑом ÑлÑÑае ÑоÑ
ÑаниÑÑÑ 2 ÑазнÑÑ
знаÑениÑ:
alert(map.get(1)); // "num1"
alert(map.get("1")); // "str1"
alert(map.size); // 3
Ðак Ð¼Ñ Ð²Ð¸Ð´Ð¸Ð¼, в оÑлиÑие Ð¾Ñ Ð¾Ð±ÑекÑов, клÑÑи не бÑли пÑÐ¸Ð²ÐµÐ´ÐµÐ½Ñ Ðº ÑÑÑокам. Ðожно иÑполÑзоваÑÑ Ð»ÑбÑе ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ Ð´Ð»Ñ ÐºÐ»ÑÑей.
map[key] ÑÑо не ÑовÑем пÑавилÑнÑй ÑпоÑоб иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ MapХоÑÑ map[key] Ñакже ÑабоÑаеÑ, напÑимеÑ, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ ÑÑÑановиÑÑ map[key] = 2, в ÑÑом ÑлÑÑаеmap ÑаÑÑмаÑÑивалÑÑ Ð±Ñ ÐºÐ°Ðº обÑÑнÑй JavaScript обÑекÑ, Ñаким обÑазом ÑÑо ведÑÑ ÐºÐ¾ вÑем ÑооÑвеÑÑÑвÑÑÑим огÑаниÑениÑм (ÑолÑко ÑÑÑоки/ÑимволÑнÑе клÑÑи и Ñак далее).
ÐоÑÑÐ¾Ð¼Ñ Ð½Ð°Ð¼ ÑледÑÐµÑ Ð¸ÑполÑзоваÑÑ Ð¼ÐµÑÐ¾Ð´Ñ map: set, get и Ñак далее.
Map Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑ Ð¾Ð±ÑекÑÑ Ð² каÑеÑÑве клÑÑей.
ÐапÑимеÑ:
let john = { name: "John" };
// давайÑе ÑоÑ
Ñаним колиÑеÑÑво поÑеÑений Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ полÑзоваÑелÑ
let visitsCountMap = new Map();
// обÑÐµÐºÑ john - ÑÑо клÑÑ Ð´Ð»Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð² обÑекÑе Map
visitsCountMap.set(john, 123);
alert(visitsCountMap.get(john)); // 123
ÐÑполÑзование обÑекÑов в каÑеÑÑве клÑÑей â одна из наиболее замеÑнÑÑ
и важнÑÑ
ÑÑнкÑий Map. ÐÑо Ñо ÑÑо невозможно Ð´Ð»Ñ Object. СÑÑока в каÑеÑÑве клÑÑа в Object â ÑÑо ноÑмалÑно, но Ð¼Ñ Ð½Ðµ можем иÑполÑзоваÑÑ Ð´ÑÑгой Object в каÑеÑÑве клÑÑа в Object.
ÐавайÑе попÑобÑем замениÑÑ Map на Object:
let john = { name: "John" };
let ben = { name: "Ben" };
let visitsCountObj = {}; // попÑобÑем иÑполÑзоваÑÑ Ð¾Ð±ÑекÑ
visitsCountObj[ben] = 234; // пÑобÑем иÑполÑзоваÑÑ Ð¾Ð±ÑÐµÐºÑ ben в каÑеÑÑве клÑÑа
visitsCountObj[john] = 123; // пÑобÑем иÑполÑзоваÑÑ Ð¾Ð±ÑÐµÐºÑ john в каÑеÑÑве клÑÑа, пÑи ÑÑом обÑÐµÐºÑ ben бÑÐ´ÐµÑ Ð·Ð°Ð¼ÐµÑÑн
// ÐÐ¾Ñ ÑÑо Ñам бÑло запиÑано!
alert( visitsCountObj["[object Object]"] ); // 123
Так как visitsCountObj ÑвлÑеÑÑÑ Ð¾Ð±ÑекÑом, он пÑеобÑазÑÐµÑ Ð²Ñе клÑÑи Object, Ñакие как john и ben, в Ð¾Ð´Ð½Ñ Ð¸ ÑÑ Ð¶Ðµ ÑÑÑÐ¾ÐºÑ "[object Object]". ÐÑо опÑеделенно не Ñо, Ñего Ð¼Ñ Ñ
оÑим.
Map ÑÑÐ°Ð²Ð½Ð¸Ð²Ð°ÐµÑ ÐºÐ»ÑÑиЧÑÐ¾Ð±Ñ ÑÑавниваÑÑ ÐºÐ»ÑÑи, обÑÐµÐºÑ Map иÑполÑзÑÐµÑ Ð°Ð»Ð³Ð¾ÑиÑм SameValueZero. ÐÑо поÑÑи Ñакое же ÑÑавнение, ÑÑо и ===, Ñ Ñой лиÑÑ ÑазниÑей, ÑÑо NaN ÑÑиÑаеÑÑÑ ÑавнÑм NaN. Так ÑÑо NaN Ñакже Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð² каÑеÑÑве клÑÑа.
ÐÑÐ¾Ñ Ð°Ð»Ð³Ð¾ÑиÑм не Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð·Ð°Ð¼ÐµÐ½Ñн или модиÑиÑиÑован.
ÐаждÑй вÑзов map.set возвÑаÑÐ°ÐµÑ Ð¾Ð±ÑÐµÐºÑ map, Ñак ÑÑо Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ обÑединиÑÑ Ð²ÑÐ·Ð¾Ð²Ñ Ð² ÑепоÑкÑ:
map.set("1", "str1")
.set(1, "num1")
.set(true, "bool1");
ÐеÑÐµÐ±Ð¾Ñ Map
ÐÐ»Ñ Ð¿ÐµÑебоÑа коллекÑии Map еÑÑÑ 3 меÑода:
map.keys()â возвÑаÑÐ°ÐµÑ Ð¸ÑеÑиÑÑемÑй обÑÐµÐºÑ Ð¿Ð¾ клÑÑам,map.values()â возвÑаÑÐ°ÐµÑ Ð¸ÑеÑиÑÑемÑй обÑÐµÐºÑ Ð¿Ð¾ знаÑениÑм,map.entries()â возвÑаÑÐ°ÐµÑ Ð¸ÑеÑиÑÑемÑй обÑÐµÐºÑ Ð¿Ð¾ паÑам вида[клÑÑ, знаÑение], ÑÑÐ¾Ñ Ð²Ð°ÑÐ¸Ð°Ð½Ñ Ð¸ÑполÑзÑеÑÑÑ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ Ð²for..of.
ÐапÑимеÑ:
let recipeMap = new Map([
["огÑÑеÑ", 500],
["помидоÑ", 350],
["лÑк", 50]
]);
// пеÑÐµÐ±Ð¾Ñ Ð¿Ð¾ клÑÑам (овоÑи)
for (let vegetable of recipeMap.keys()) {
alert(vegetable); // огÑÑеÑ, помидоÑ, лÑк
}
// пеÑÐµÐ±Ð¾Ñ Ð¿Ð¾ знаÑениÑм (ÑиÑла)
for (let amount of recipeMap.values()) {
alert(amount); // 500, 350, 50
}
// пеÑÐµÐ±Ð¾Ñ Ð¿Ð¾ ÑлеменÑам в ÑоÑмаÑе [клÑÑ, знаÑение]
for (let entry of recipeMap) { // Ñо же Ñамое, ÑÑо и recipeMap.entries()
alert(entry); // огÑÑеÑ,500 (и Ñак далее)
}
РоÑлиÑие Ð¾Ñ Ð¾Ð±ÑÑнÑÑ
обÑекÑов Object, в Map пеÑÐµÐ±Ð¾Ñ Ð¿ÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð² Ñом же поÑÑдке, в каком пÑоиÑÑ
одило добавление ÑлеменÑов.
ÐÑоме ÑÑого, Map Ð¸Ð¼ÐµÐµÑ Ð²ÑÑÑоеннÑй меÑод forEach, ÑÑ
ожий Ñо вÑÑÑоеннÑм меÑодом маÑÑивов Array:
// вÑполнÑем ÑÑнкÑÐ¸Ñ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ паÑÑ (клÑÑ, знаÑение)
recipeMap.forEach((value, key, map) => {
alert(`${key}: ${value}`); // огÑÑеÑ: 500 и Ñак далее
});
Object.entries: Map из Object
ÐÑи Ñоздании Map Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ ÑказаÑÑ Ð¼Ð°ÑÑив (или дÑÑгой иÑеÑиÑÑемÑй обÑекÑ) Ñ Ð¿Ð°Ñами клÑÑ-знаÑение Ð´Ð»Ñ Ð¸Ð½Ð¸ÑиализаÑии, как здеÑÑ:
// маÑÑив Ð¿Ð°Ñ [клÑÑ, знаÑение]
let map = new Map([
['1', 'str1'],
[1, 'num1'],
[true, 'bool1']
]);
alert( map.get('1') ); // str1
ÐÑли Ñ Ð½Ð°Ñ Ñже еÑÑÑ Ð¾Ð±ÑÑнÑй обÑекÑ, и Ð¼Ñ Ñ
оÑели Ð±Ñ ÑоздаÑÑ Map из него, Ñо Ð¿Ð¾Ð¼Ð¾Ð¶ÐµÑ Ð²ÑÑÑоеннÑй меÑод Object.entries(obj), коÑоÑÑй полÑÑÐ°ÐµÑ Ð¾Ð±ÑÐµÐºÑ Ð¸ возвÑаÑÐ°ÐµÑ Ð¼Ð°ÑÑив Ð¿Ð°Ñ ÐºÐ»ÑÑ-знаÑение Ð´Ð»Ñ Ð½ÐµÐ³Ð¾, как Ñаз в ÑÑом ÑоÑмаÑе.
Так ÑÑо Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ ÑоздаÑÑ Map из обÑÑного обÑекÑа ÑледÑÑÑим обÑазом:
let obj = {
name: "John",
age: 30
};
let map = new Map(Object.entries(obj));
alert( map.get('name') ); // John
ÐдеÑÑ Object.entries возвÑаÑÐ°ÐµÑ Ð¼Ð°ÑÑив Ð¿Ð°Ñ ÐºÐ»ÑÑ-знаÑение: [ ["name","John"], ["age", 30] ]. ÐÑо именно Ñо, ÑÑо нÑжно Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Map.
Object.fromEntries: Object из Map
ÐÑ ÑолÑко ÑÑо видели, как ÑоздаÑÑ Map из обÑÑного обÑекÑа пÑи помоÑи Object.entries(obj).
ÐÑÑÑ Ð¼ÐµÑод Object.fromEntries, коÑоÑÑй Ð´ÐµÐ»Ð°ÐµÑ Ð¿ÑоÑивоположное: полÑÑив маÑÑив Ð¿Ð°Ñ Ð²Ð¸Ð´Ð° [клÑÑ, знаÑение], он ÑоздаÑÑ Ð¸Ð· ниÑ
обÑекÑ:
let prices = Object.fromEntries([
['banana', 1],
['orange', 2],
['meat', 4]
]);
// prices = { banana: 1, orange: 2, meat: 4 }
alert(prices.orange); // 2
ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ иÑполÑзоваÑÑ Object.fromEntries, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ð¾Ð±ÑÑнÑй обÑÐµÐºÑ Ð¸Ð· Map.
РпÑимеÑÑ, Ñ Ð½Ð°Ñ Ð´Ð°Ð½Ð½Ñе в Map, но иÑ
нÑжно пеÑедаÑÑ Ð² ÑÑоÑонний код, коÑоÑÑй Ð¾Ð¶Ð¸Ð´Ð°ÐµÑ Ð¾Ð±ÑÑнÑй обÑекÑ.
ÐÐ¾Ñ ÐºÐ°Ðº ÑÑо ÑделаÑÑ:
let map = new Map();
map.set('banana', 1);
map.set('orange', 2);
map.set('meat', 4);
let obj = Object.fromEntries(map.entries()); // ÑоздаÑм обÑÑнÑй обÑÐµÐºÑ (*)
// гоÑово!
// obj = { banana: 1, orange: 2, meat: 4 }
alert(obj.orange); // 2
ÐÑзов map.entries() возвÑаÑÐ°ÐµÑ Ð¸ÑеÑиÑÑемÑй обÑÐµÐºÑ Ð¿Ð°Ñ ÐºÐ»ÑÑ/знаÑение, как Ñаз в нÑжном ÑоÑмаÑе Ð´Ð»Ñ Object.fromEntries.
ÐÑ Ð¼Ð¾Ð³Ð»Ð¸ Ð±Ñ Ð½Ð°Ð¿Ð¸ÑаÑÑ ÑÑÑÐ¾ÐºÑ (*) еÑÑ ÐºÐ¾ÑоÑе:
let obj = Object.fromEntries(map); // ÑбÑаÑÑ .entries()
ÐÑо Ñо же Ñамое, Ñак как Object.fromEntries Ð¾Ð¶Ð¸Ð´Ð°ÐµÑ Ð¿ÐµÑебиÑаемÑй обÑÐµÐºÑ Ð² каÑеÑÑве аÑгÑменÑа, не обÑзаÑелÑно маÑÑив. РпеÑÐµÐ±Ð¾Ñ map как Ñаз возвÑаÑÐ°ÐµÑ Ð¿Ð°ÑÑ ÐºÐ»ÑÑ/знаÑение, Ñак же, как и map.entries(). Так ÑÑо в иÑоге Ñ Ð½Ð°Ñ Ð±ÑÐ´ÐµÑ Ð¾Ð±ÑÑнÑй обÑÐµÐºÑ Ñ Ñеми же клÑÑами/знаÑениÑми, ÑÑо и в map.
Set
ÐбÑÐµÐºÑ Set â ÑÑо оÑобÑй вид коллекÑии: «множеÑÑво» знаÑений (без клÑÑей), где каждое знаÑение Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ÑвлÑÑÑÑÑ ÑолÑко один Ñаз.
Ðго оÑновнÑе меÑÐ¾Ð´Ñ ÑÑо:
new Set(iterable)â ÑоздаÑÑSet, и еÑли в каÑеÑÑве аÑгÑменÑа бÑл пÑедоÑÑавлен иÑеÑиÑÑемÑй обÑÐµÐºÑ (обÑÑно ÑÑо маÑÑив), Ñо копиÑÑÐµÑ ÐµÐ³Ð¾ знаÑÐµÐ½Ð¸Ñ Ð² новÑйSet.set.add(value)â добавлÑÐµÑ Ð·Ð½Ð°Ñение (еÑли оно Ñже еÑÑÑ, Ñо ниÑего не делаеÑ), возвÑаÑÐ°ÐµÑ ÑÐ¾Ñ Ð¶Ðµ обÑекÑset.set.delete(value)â ÑдалÑÐµÑ Ð·Ð½Ð°Ñение, возвÑаÑаеÑtrue, еÑлиvalueбÑло в множеÑÑве на Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð²Ñзова, инаÑеfalse.set.has(value)â возвÑаÑаеÑtrue, еÑли знаÑение пÑиÑÑÑÑÑвÑÐµÑ Ð² множеÑÑве, инаÑеfalse.set.clear()â ÑдалÑÐµÑ Ð²Ñе имеÑÑиеÑÑ Ð·Ð½Ð°ÑениÑ.set.sizeâ возвÑаÑÐ°ÐµÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво ÑлеменÑов в множеÑÑве.
ÐÑÐ½Ð¾Ð²Ð½Ð°Ñ Â«Ð¸Ð·Ñминка» â ÑÑо Ñо, ÑÑо пÑи повÑоÑнÑÑ
вÑзоваÑ
set.add() Ñ Ð¾Ð´Ð½Ð¸Ð¼ и Ñем же знаÑением ниÑего не пÑоиÑÑ
одиÑ, за ÑÑÑÑ ÑÑого как Ñаз и полÑÑаеÑÑÑ, ÑÑо каждое знаÑение поÑвлÑеÑÑÑ Ð¾Ð´Ð¸Ð½ Ñаз.
ÐапÑимеÑ, Ð¼Ñ Ð¾Ð¶Ð¸Ð´Ð°ÐµÐ¼ поÑеÑиÑелей, и нам Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ ÑоÑÑавиÑÑ Ð¸Ñ ÑпиÑок. Ðо повÑоÑнÑе визиÑÑ Ð½Ðµ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¿ÑиводиÑÑ Ðº дÑбликаÑам. ÐаждÑй поÑеÑиÑÐµÐ»Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ поÑвиÑÑÑÑ Ð² ÑпиÑке ÑолÑко один Ñаз.
ÐножеÑÑво Set â как Ñаз Ñо, ÑÑо нÑжно Ð´Ð»Ñ ÑÑого:
let set = new Set();
let john = { name: "John" };
let pete = { name: "Pete" };
let mary = { name: "Mary" };
// ÑÑиÑаем гоÑÑей, некоÑоÑÑе пÑиÑ
одÑÑ Ð½ÐµÑколÑко Ñаз
set.add(john);
set.add(pete);
set.add(mary);
set.add(john);
set.add(mary);
// set Ñ
ÑÐ°Ð½Ð¸Ñ ÑолÑко 3 ÑникалÑнÑÑ
знаÑениÑ
alert(set.size); // 3
for (let user of set) {
alert(user.name); // John (поÑом Pete и Mary)
}
ÐлÑÑеÑнаÑивой множеÑÑÐ²Ñ Set Ð¼Ð¾Ð¶ÐµÑ Ð²ÑÑÑÑпаÑÑ Ð¼Ð°ÑÑив Ð´Ð»Ñ Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð³Ð¾ÑÑей и дополниÑелÑнÑй код Ð´Ð»Ñ Ð¿ÑовеÑки Ñже имеÑÑегоÑÑ ÑлеменÑа Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ arr.find. Ðо в ÑÑом ÑлÑÑае бÑÐ´ÐµÑ Ñ
Ñже пÑоизводиÑелÑноÑÑÑ, поÑÐ¾Ð¼Ñ ÑÑо arr.find пÑоÑ
Ð¾Ð´Ð¸Ñ Ð²ÐµÑÑ Ð¼Ð°ÑÑив Ð´Ð»Ñ Ð¿ÑовеÑки налиÑÐ¸Ñ ÑлеменÑа. ÐножеÑÑво Set лÑÑÑе опÑимизиÑовано Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ð¹, оно авÑомаÑиÑеÑки пÑовеÑÑÐµÑ Ð½Ð° ÑникалÑноÑÑÑ.
ÐеÑÐµÐ±Ð¾Ñ Ð¾Ð±ÑекÑа Set
ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ пеÑебÑаÑÑ ÑодеÑжимое обÑекÑа set как Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¼ÐµÑода for..of, Ñак и иÑполÑзÑÑ forEach:
let set = new Set(["апелÑÑин", "Ñблоко", "банан"]);
for (let value of set) alert(value);
// Ñо же Ñамое Ñ forEach:
set.forEach((value, valueAgain, set) => {
alert(value);
});
ÐамеÑим забавнÑÑ Ð²ÐµÑÑ. ФÑнкÑÐ¸Ñ Ð² forEach Ñ Set Ð¸Ð¼ÐµÐµÑ 3 аÑгÑменÑа: знаÑение value, поÑом Ñнова Ñо же Ñамое знаÑение valueAgain, и ÑолÑко поÑом Ñелевой обÑекÑ. ÐÑо дейÑÑвиÑелÑно Ñак, знаÑение поÑвлÑеÑÑÑ Ð² ÑпиÑке аÑгÑменÑов дваждÑ.
ÐÑо Ñделано Ð´Ð»Ñ ÑовмеÑÑимоÑÑи Ñ Ð¾Ð±ÑекÑом Map, в коÑоÑом колбÑк forEach Ð¸Ð¼ÐµÐµÑ 3 аÑгÑменÑа. ÐÑглÑÐ´Ð¸Ñ Ð½ÐµÐ¼Ð½Ð¾Ð³Ð¾ ÑÑÑанно, но в некоÑоÑÑÑ
ÑлÑÑаÑÑ
Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð¼Ð¾ÑÑ Ð»ÐµÐ³ÐºÐ¾ замениÑÑ Map на Set и наобоÑоÑ.
Set Ð¸Ð¼ÐµÐµÑ Ñе же вÑÑÑоеннÑе меÑодÑ, ÑÑо и Map:
set.values()â возвÑаÑÐ°ÐµÑ Ð¿ÐµÑебиÑаемÑй обÑÐµÐºÑ Ð´Ð»Ñ Ð·Ð½Ð°Ñений,set.keys()â Ñо же Ñамое, ÑÑо иset.values(), пÑиÑÑÑÑÑвÑÐµÑ Ð´Ð»Ñ Ð¾Ð±ÑаÑной ÑовмеÑÑимоÑÑи ÑMap,set.entries()â возвÑаÑÐ°ÐµÑ Ð¿ÐµÑебиÑаемÑй обÑÐµÐºÑ Ð´Ð»Ñ Ð¿Ð°Ñ Ð²Ð¸Ð´Ð°[знаÑение, знаÑение], пÑиÑÑÑÑÑвÑÐµÑ Ð´Ð»Ñ Ð¾Ð±ÑаÑной ÑовмеÑÑимоÑÑи ÑMap.
ÐÑого
Map â коллекÑÐ¸Ñ Ð¿Ð°Ñ ÐºÐ»ÑÑ-знаÑение.
ÐеÑÐ¾Ð´Ñ Ð¸ ÑвойÑÑва:
new Map([iterable])â ÑоздаÑÑ ÐºÐ¾Ð»Ð»ÐµÐºÑиÑ, можно ÑказаÑÑ Ð¿ÐµÑебиÑаемÑй обÑÐµÐºÑ (обÑÑно маÑÑив) из паÑ[клÑÑ,знаÑение]Ð´Ð»Ñ Ð¸Ð½Ð¸ÑиализаÑии.map.set(key, value)â запиÑÑÐ²Ð°ÐµÑ Ð¿Ð¾ клÑÑÑkeyзнаÑениеvalue.map.get(key)â возвÑаÑÐ°ÐµÑ Ð·Ð½Ð°Ñение по клÑÑÑ Ð¸Ð»Ð¸undefined, еÑли клÑÑkeyоÑÑÑÑÑÑвÑеÑ.map.has(key)â возвÑаÑаеÑtrue, еÑли клÑÑkeyпÑиÑÑÑÑÑвÑÐµÑ Ð² коллекÑии, инаÑеfalse.map.delete(key)â ÑдалÑÐµÑ ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¿Ð¾ клÑÑÑkey.map.clear()â оÑиÑÐ°ÐµÑ ÐºÐ¾Ð»Ð»ÐµÐºÑÐ¸Ñ Ð¾Ñ Ð²ÑÐµÑ ÑлеменÑов.map.sizeâ возвÑаÑÐ°ÐµÑ ÑекÑÑее колиÑеÑÑво ÑлеменÑов.
ÐÑлиÑÐ¸Ñ Ð¾Ñ Ð¾Ð±ÑÑного обÑекÑа Object:
- ЧÑо Ñгодно Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÐºÐ»ÑÑом, в Ñом ÑиÑле и обÑекÑÑ.
- ÐÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе меÑодÑ, ÑвойÑÑво
size.
Set â коллекÑÐ¸Ñ ÑникалÑнÑÑ
знаÑений, Ñак назÑваемое «множеÑÑво».
ÐеÑÐ¾Ð´Ñ Ð¸ ÑвойÑÑва:
new Set(iterable)â ÑоздаÑÑSet, можно ÑказаÑÑ Ð¿ÐµÑебиÑаемÑй обÑÐµÐºÑ Ñо знаÑениÑми Ð´Ð»Ñ Ð¸Ð½Ð¸ÑиализаÑии.set.add(value)â добавлÑÐµÑ Ð·Ð½Ð°Ñение (еÑли оно Ñже еÑÑÑ, Ñо ниÑего не делаеÑ), возвÑаÑÐ°ÐµÑ ÑÐ¾Ñ Ð¶Ðµ обÑекÑset.set.delete(value)â ÑдалÑÐµÑ Ð·Ð½Ð°Ñение, возвÑаÑаеÑtrueеÑлиvalueбÑло в множеÑÑве на Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð²Ñзова, инаÑеfalse.set.has(value)â возвÑаÑаеÑtrue, еÑли знаÑение пÑиÑÑÑÑÑвÑÐµÑ Ð² множеÑÑве, инаÑеfalse.set.clear()â ÑдалÑÐµÑ Ð²Ñе имеÑÑиеÑÑ Ð·Ð½Ð°ÑениÑ.set.sizeâ возвÑаÑÐ°ÐµÑ ÐºÐ¾Ð»Ð¸ÑеÑÑво ÑлеменÑов в множеÑÑве.
ÐеÑÐµÐ±Ð¾Ñ Map и Set вÑегда оÑÑÑеÑÑвлÑеÑÑÑ Ð² поÑÑдке Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ ÑлеменÑов, Ñак ÑÑо нелÑÐ·Ñ ÑказаÑÑ, ÑÑо ÑÑо â неÑпоÑÑдоÑеннÑе коллекÑии, но поменÑÑÑ Ð¿Ð¾ÑÑдок ÑлеменÑов или полÑÑиÑÑ ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð½Ð°Ð¿ÑÑмÑÑ Ð¿Ð¾ его номеÑÑ Ð½ÐµÐ»ÑзÑ.
ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)