ilyachalov (ilyachalov) wrote,
ilyachalov
ilyachalov

Categories:

Учебник по JavaScript: ч.1, Типы данных: Map и Set

Читаю пятый раздел («Типы данных») первой части («Язык программирования JavaScript») учебника по JavaScript.

https://learn.javascript.ru

Часть 1. Язык программирования JavaScript (в т.ч. 93 подраздела)

Разделы:

5. Типы данных (12 подразделов)

5.6 Перебираемые объекты
5.7 Map и Set
5.8 WeakMap и WeakSet
5.9 Object.keys, values, entries

В языке JavaScript, как мне кажется, довольно путаная ситуация с коллекциями данных. Но разобраться можно. В принципе, как я понял, тип данных в основе коллекций только один — это Object, а на его базе построено всё остальное. Есть «перебираемые объекты» (они же — «итерируемые объекты»), «массивы», «псевдомассивы» и так далее. Эти понятия не следует путать.

Видно, что язык JavaScript построен на языке C++ и особенно на библиотеке STL, она «выглядывает» во многих местах. Лично мне при изучении языка JavaScript очень помогает знакомство с этой библиотекой по учебнику Лафоре.

Коллекция данных Map содержит элементы (entries), состоящие из пар «ключ, значение» (key, value). По-русски слово «Map» в данном контексте переводится как «сопоставление» или «отображение». Имеется в виду, что к ключам привязываются некие значения (ключам сопоставляются значения, множество ключей отображается на множество значений и наоборот).

Коллекция данных Set (по-русски «множество» или «набор» значений) содержит элементы (entries), каждый из которых является и ключом (key), и значением (value).

Понимая, что такое «ключ» (это идентификатор некоего значения, главным свойством которого является его уникальность — этим гарантируется, что по некоему ключу мы точно получим только одно значение; то есть в одной коллекции данных у нескольких значений не может быть одного и того же ключа!), можно понять, для каких целей возможно использовать коллекции данных Map и Set и откуда берутся некоторые свойства этих коллекций (например, почему в Set не может быть несколько одинаковых элементов (потому что в Set сами элементы-значения являются своими же ключами, а в одной коллекции данных не может быть нескольких одинаковых ключей)).

Коллекции данных WeakMap и WeakSet похожи на своих «сильных» партнеров Map и Set. Только присутствие неких данных в WeakMap и WeakSet не делает их «достижимыми» при их анализе со стороны «сборщика мусора» (о понятии «достижимость» в применении к управлению памятью и «сборщике мусора» рассказывалось ранее в подразделе «Сборка мусора» учебника). Для чего это нужно и как это использовать, рассказано в подразделе 5.8 учебника.

Мне понравилась задача «Отфильтруйте анаграммы»:
https://learn.javascript.ru/task/filter-anagrams

Нужно написать функцию, на вход которой подается массив строк. Функция тоже должна вернуть массив строк. В возвращаемом массиве должны остаться только строки-единственные варианты анаграмм.

В качестве примера в задаче задается для обработки следующий массив строк:
let arr = ["nap", "teachers", "cheaters", "PAN", "ear", "era", "hectares"];

В этом массиве строк слово «nap» является анаграммой слова «PAN» (кто не знает, слово-анаграмма другого слова получается из исходного слова перестановкой букв). Вообще, в этом массиве есть три цепочки анаграмм:
nap - PAN
teachers - cheaters - hectares
ear - era

Наша функция должна вернуть массив строк, в котором будет содержаться только по одному слову из каждой цепочки (слова-анаграммы считаются дубликатами и эти дубликаты по заданию следует не включать в итоговый массив, возвращаемый нашей функцией).

Очевидно, что в зависимости от того, как функция будет написана, она может вернуть несколько разных результатов, которые всё же будут удовлетворять условиям задания. Например, наша функция может вернуть следующие массивы для вышеприведенного массива строк:
["nap", "teachers", "ear"] // 1
["PAN", "hectares", "era"] // 2
["nap", "cheaters", "era"]
// ...и так далее...

Мой вариант решения оказался очень близок к варианту решения от авторов учебника. По-моему, это показывает, что учебник хорошо выполняет свою миссию и обучает. Мой вариант:
function aclean(arr) {
    let map_words = new Map();
    
    for (let word of arr) {
        let key = Array.from(word).sort().join("").toLowerCase();
        if (!map_words.has(key)) {
            map_words.set(key, word);
        }
    }
    
    return Array.from(map_words.values());
}

Из-за дополнительного if мой вариант функции для вышеприведенного исходного массива строк возвращает массив ["nap", "teachers", "ear"], то есть первые слова из каждой цепочки анаграмм. А вариант авторов учебника возвращает массив, состоящий из последних слов из каждой цепочки анаграмм ["PAN", "hectares", "era"].
Tags: Образование, Программирование
Subscribe

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 0 comments