Loading...

map жана set

map жана set

 

Биз азыр төмөнкү татаал маалымат структуралары жөнүндө билебиз:

  • Аты аталган коллекцияларды сактоо үчүн объекттер.
  • Тартиптүү коллекцияларды сактоо үчүн массивдер.

Бирок бул күнүмдүк көйгөйлөрдү чечүү үчүн дайыма эле жетиштүү боло бербейт. MapОшондуктан, ошондой эле бар Set.

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- элементтердин учурдагы санын кайтарат.

Мисалы:

 
 
@A@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@A@

Көрүнүп тургандай, объекттерден айырмаланып, баскычтар саптарга ыргытылган эмес. Ачкычтар үчүн каалаган маалымат түрүн колдоно аласыз.

map[key]бул колдонуунун туура жолу эмесMap

Ал дагы иштейт да map[key], мисалы, биз орното алабыз map[key] = 2, бул учурда mapал кадимки JavaScript объектиси катары каралат, андыктан бул бардык тиешелүү чектөөлөргө алып келет (саптар/символ ачкычтары жана башкалар).

mapОшондуктан, биз : setжана getбашка ыкмаларды колдонушубуз керек .

map объекттерди ачкыч катары колдоно алат.

Мисалы:

@A@let john = { name: "John" };

// давайте сохраним количество посещений для каждого пользователя
let visitsCountMap = new Map();

// объект john - это ключ для значения в объекте Map
visitsCountMap.set(john, 123);

alert(visitsCountMap.get(john)); // 123@A@

Объекттерди ачкыч катары колдонуу эң көрүнүктүү жана маанилүү өзгөчөлүктөрүнүн бири Map. Бул мүмкүн эмес нерсе Object. Ачкыч катары сап Objectжакшы, бирок биз Objectбашкасын Object.

Mapменен алмаштырууга аракет кылалы Object:

@A@let john = { name: "John" };
let ben = { name: "Ben" };

let visitsCountObj = {}; // попробуем использовать объект

visitsCountObj[ben] = 234; // пробуем использовать объект ben в качестве ключа
visitsCountObj[john] = 123; // пробуем использовать объект john в качестве ключа, при этом объект ben будет замещён

// Вот что там было записано!
alert( visitsCountObj["[object Object]"] ); // 123@A@

visitsCountObjОбъект болгондуктан, ал жана сыяктуу Objectбардык баскычтарды бир сапка айлантат . Бул, албетте, биз каалаган нерсе эмес.johnben"[object Object]"

Объект Mapачкычтарды кантип салыштырат

Ачкычтарды салыштыруу үчүн объект SameValueZeroMap алгоритмин колдонот . Бул дээрлик бирдей салыштыруу, бир гана айырмасы, ал барабар деп эсептелет . Ошентип, аны ачкыч катары да колдонсо болот.===NaNNaNNaN

Бул алгоритмди алмаштыруу же өзгөртүү мүмкүн эмес.

Чалуу тизмеги

Ар бир чалуу map.setкарта объектисин кайтарат, ошондуктан биз чалууларды бириктире алабыз:

map.set("1", "str1")
  .set(1, "num1")
  .set(true, "bool1");

Итерацияланган карта

Коллекцияны кайталоонун 3 ыкмасы бар Map:

  • map.keys()- баскычтар аркылуу кайталануучу объектти кайтарат,
  • map.values()- кайталануучу объектти маанилер боюнча кайтарат,
  • map.entries()– форманын жуптары боюнча кайталануучу объектти кайтарат [ключ, значение], бул параметр демейки боюнча for..of.

Мисалы:

@A@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 (и так далее)
}@A@
Киргизүү тартиби колдонулат

Кадимки объекттерден айырмаланып ObjectMapитерация элементтер кошулган тартипте ишке ашат.

Мындан тышкары, анын камтылган массив ыкмасына окшош Mapорнотулган ыкмасы бар :forEachArray

@A@// выполняем функцию для каждой пары (ключ, значение)
recipeMap.forEach((value, key, map) => {
  alert(`${key}: ${value}`); // огурец: 500 и так далее
});@A@

Object.entries: Объекттин картасы

Түзүүдө Mapбиз инициализациялоо үчүн ачкыч-маани жуптары менен массивди (же башка кайталануучу объектти) көрсөтө алабыз, мисалы:

@A@// массив пар [ключ, значение]
let map = new Map([
  ['1',  'str1'],
  [1,    'num1'],
  [true, 'bool1']
]);

alert( map.get('1') ); // str1@A@

MapЭгерде бизде кадимки объект болсо жана биз андан түзүүнү кааласак , анда объектти кабыл алып, ал үчүн ачкыч-маани түгөйлөрүнүн массивдерин кайтарып турган Object.entries(obj) методу жардам берет. формат.

MapОшентип, биз бул сыяктуу кадимки объекттен түзө алабыз 

@A@let obj = {
  name: "John",
  age: 30
};

let map = new Map(Object.entries(obj));

alert( map.get('name') ); // John@A@

Бул жерде Object.entriesачкыч-маани жуптарынын массивдерин кайтарат: [ ["name","John"], ["age", 30] ]. Бул сиз түзүшүңүз керек болгон нерсе Map.

Object.fromEntries: Картадан объект

MapБиз жөн гана колдонуп, кадимки объекттен кантип түзүүнү көрдүк Object.entries(obj).

Object.fromEntriesТескерисинче бир ыкма бар : форманын жуптарынын массивине ылайык [ключ, значение], ал алардан объект түзөт:

@A@let prices = Object.fromEntries([
  ['banana', 1],
  ['orange', 2],
  ['meat', 4]
]);

// prices = { banana: 1, orange: 2, meat: 4 }

alert(prices.orange); // 2@A@

Object.fromEntriesКадимки объектти алуу үчүн колдоно алабыз Map.

Мисалы, бизде маалыматтар бар Map, бирок алар кадимки объектти күткөн үчүнчү тараптын кодуна өтүшү керек.

Муну кантип жасоо керек:

@A@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@A@

Чалуу 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керек

@A@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)
}@A@

Топтого альтернатива болуп Setконокторду кармоо үчүн массив жана arr.find менен мурунтан эле бар элементти текшерүү үчүн кошумча код болот . Бирок бул учурда, аткаруу начарыраак болот, анткени ал arr.findэлементтин бар-жоктугун текшерүү үчүн бүт массивден өтөт. Комплект Setтолуктоолор үчүн жакшыраак оптималдаштырылган, ал уникалдуулукту автоматтык түрдө текшерет.

Set объектинин үстүнөн кайталоо

Биз коюлган объекттин мазмунун метод менен for..ofже менен кайталай алабыз forEach:

@A@let set = new Set(["апельсин", "яблоко", "банан"]);

for (let value of set) alert(value);

// то же самое с forEach:
set.forEach((value, valueAgain, set) => {
  alert(value);
});@A@

Бир күлкүлүү нерсеге көңүл буралы. forEachy ичиндеги функциянын Set3 аргументи бар: value value, анан ошол эле маани кайра valueAgain , андан кийин гана максаттуу объект. Бул туура, маани аргументтердин тизмесинде эки жолу пайда болот.

MapБул кайра чалуу forEach3 аргументи бар объект менен шайкештик үчүн . Бул бир аз кызыктай көрүнөт, бирок кээ бир учурларда ал оңой Mapменен алмаштырууга жардам берет Setжана тескерисинче.

Setсыяктуу орнотулган ыкмаларга ээ Map:

  • set.keys()- баалуулуктар үчүн кайталануучу объектти кайтарат,
  • set.values()– сыяктуу эле, set.keys()менен артка шайкештик үчүн берилген 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ар дайым элементтер кошулган тартипте жасалат, ошондуктан бул иретсиз жыйнактар ​​деп айтууга болбойт, бирок элементтердин тартибин өзгөртө албайсыз же элементти анын саны боюнча түздөн-түз ала албайсыз.

Tasks

маанилүүлүгү: 5

Бизде массив бар дейли arr.

unique(arr)Уникалдуу, кайталанбаган массив маанилеринин массивин кайтара турган функцияны түзүңүз arr.

Мисалы:

@A@function unique(arr) {
  /* ваш код */
}

let values = ["Hare", "Krishna", "Hare", "Krishna",
  "Krishna", "Krishna", "Hare", "Hare", ":-O"
];

alert( unique(values) ); // Hare,Krishna,:-O@A@

PS Биз бул жерде саптарды колдонуп жатабыз, бирок баалуулуктар ар кандай болушу мүмкүн.

SetPPS Уникалдуу баалуулуктарды сактоо үчүн колдонуңуз .

Тапшырма үчүн тесттер менен кумкоргонду ачыңыз.

чечим
маанилүүлүгү: 4

Анаграммалар - бир эле санда бирдей тамгалар бар, бирок алар башка тартипте жайгашкан сөздөр.

Мисалы:

nap - pan
ear - are - era
cheaters - hectares - teachers

aclean(arr)Анаграммалардан ажыратылган сөздөрдүн массивин кайтаруучу функцияны жазыңыз .

Мисалы:

let arr = ["nap", "teachers", "cheaters", "PAN", "ear", "era", "hectares"];

alert( aclean(arr) ); // "nap,teachers,ear" или "PAN,cheaters,era"

Анаграммалардын ар бир тобунан кайсынысы болбосун, бир гана сөз калышы керек.

Тапшырма үчүн тесттер менен кумкоргонду ачыңыз.

чечим
маанилүүлүгү: 5

Биз өзгөрүлмө ачкычтардын массивдерин алып map.keys(), анан алар менен иштешкибиз келет, мисалы, .push.

Бирок чыкпайт:

 
 
@A@let map = new Map();

map.set("name", "John");

let keys = map.keys();

// Error: keys.push is not a function
// Ошибка: keys.push -- это не функция
keys.push("more");@A@

Неге? keys.pushЧалуу иштеши үчүн коддо эмнени өзгөртүү керек ?