jkulvich

anagramGroup func ru ver

Jun 20th, 2021
675
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /**
  2.  * anagramGroup - Группирует слова по их анаграммам
  3.  * @param   {Array}  words - Список слов
  4.  * @param   {Number} words - Исключить группы с количеством слов менее значения
  5.  * @returns {Array}  Сортированный массив с группами
  6.  * @throws  {Error}  Ошибка если неверный аргумент вроде значения не массива или
  7.  *                   одно из значений в массиве не строка
  8.  * @example
  9.  * // returns [['кот', 'ток'], ['липа', 'пила']]
  10.  * anagramGroup(['кот', 'пила', 'липа', 'пост', 'ток'])
  11.  */
  12.  function anagramGroup(words, minGroupSize) {
  13.     'use strict'
  14.  
  15.     // Установка значений по умалчанию для аргументов
  16.     if (!minGroupSize) minGroupSize = 2
  17.  
  18.     // Проверка аргументов на типы и допустимые значения
  19.     if (!words)
  20.         throw new Error(`anagramGroup: arg 'words' isn't value`)
  21.    if (!Array.isArray(words))
  22.        throw new Error(`anagramGroup: arg 'words' isn't Array`)
  23.     if (!words.every(word => typeof word === typeof String()))
  24.         throw new Error(`anagramGroup: one of element inside 'words' isn't Number`)
  25.    if (typeof minGroupSize !== typeof Number())
  26.        throw new Error(`anagramGroup: arg 'minGroupSize' isn't Number`)
  27.  
  28.     // Словарь групп по их хэшу
  29.     // ключ - хэш слов (строка отсортированных символов слова)
  30.     // значение - массив слов
  31.     const wordsMap = new Set()
  32.  
  33.     // Группировка
  34.     words.forEach(word => {
  35.         // Расчёт хэша
  36.         const hash = word.split('').sort().join('')
  37.         // Проверка на не инициализированные значения словаря
  38.         // Ситуация возникает при создании группы с первым словом
  39.         if (!wordsMap[hash]) wordsMap[hash] = []
  40.         // Добавление слова в группу
  41.         wordsMap[hash].push(word)
  42.     })
  43.  
  44.     // Получение всех групп. Берём только значения из словаря
  45.     let wordsGroups = Object.values(wordsMap)
  46.  
  47.     // Обрезаем все группы количество слов в которых меньше minGroupSize
  48.     wordsGroups = wordsGroups.filter(group => group.length >= minGroupSize)
  49.     // Сортировка слов в каждой группе
  50.     wordsGroups = wordsGroups.map(group => group.sort())
  51.     // Сортировка групп
  52.     wordsGroups = wordsGroups.sort()
  53.  
  54.     return wordsGroups
  55. }
RAW Paste Data