Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**
- * anagramGroup - Группирует слова по их анаграммам
- * @param {Array} words - Список слов
- * @param {Number} words - Исключить группы с количеством слов менее значения
- * @returns {Array} Сортированный массив с группами
- * @throws {Error} Ошибка если неверный аргумент вроде значения не массива или
- * одно из значений в массиве не строка
- * @example
- * // returns [['кот', 'ток'], ['липа', 'пила']]
- * anagramGroup(['кот', 'пила', 'липа', 'пост', 'ток'])
- */
- function anagramGroup(words, minGroupSize) {
- 'use strict'
- // Установка значений по умалчанию для аргументов
- if (!minGroupSize) minGroupSize = 2
- // Проверка аргументов на типы и допустимые значения
- if (!words)
- throw new Error(`anagramGroup: arg 'words' isn't value`)
- if (!Array.isArray(words))
- throw new Error(`anagramGroup: arg 'words' isn't Array`)
- if (!words.every(word => typeof word === typeof String()))
- throw new Error(`anagramGroup: one of element inside 'words' isn't Number`)
- if (typeof minGroupSize !== typeof Number())
- throw new Error(`anagramGroup: arg 'minGroupSize' isn't Number`)
- // Словарь групп по их хэшу
- // ключ - хэш слов (строка отсортированных символов слова)
- // значение - массив слов
- const wordsMap = new Set()
- // Группировка
- words.forEach(word => {
- // Расчёт хэша
- const hash = word.split('').sort().join('')
- // Проверка на не инициализированные значения словаря
- // Ситуация возникает при создании группы с первым словом
- if (!wordsMap[hash]) wordsMap[hash] = []
- // Добавление слова в группу
- wordsMap[hash].push(word)
- })
- // Получение всех групп. Берём только значения из словаря
- let wordsGroups = Object.values(wordsMap)
- // Обрезаем все группы количество слов в которых меньше minGroupSize
- wordsGroups = wordsGroups.filter(group => group.length >= minGroupSize)
- // Сортировка слов в каждой группе
- wordsGroups = wordsGroups.map(group => group.sort())
- // Сортировка групп
- wordsGroups = wordsGroups.sort()
- return wordsGroups
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement