BenderIsGreat34
@BenderIsGreat34
junior front-end

Задачка с нахождением анаграмм в массиве?

Я решил задачу с анаграмами вот таким способом:
function anagrams(word, words) {
    return words.filter(function (e) {
        return e.split('').sort().join('') === word.split('').sort().join('');
    })
}
но данный способ не является хорошей практикой. как можно улучшить данный код?
  • Вопрос задан
  • 2445 просмотров
Решения вопроса 1
sergiks
@sergiks Куратор тега JavaScript
♬♬
как можно улучшить данный код

Избежать лишних действий.

Например, незачем на каждом шаге снова разбивать и сортировать исходное слово – достаточно сделать это один раз:
function anagrams(word, words) {
    const sample = word.split('').sort().join('');
    return words.filter(function (e) {
        return e.split('').sort().join('') === sample;
    })
}


Нет смысла проверять неподходящие по длине слова.
function anagrams(word, words) {
    const length = word.length;
    const sample = word.split('').sort().join('');
    return words.filter(w => w.length === length)
        .filter(function (e) {
            return e.split('').sort().join('') === sample;
        })
}


P.S. я вот такое решение отправил. Сравнить длину. Привести к lowercase. Запоминать позиции, в которых найден очередной символ и дальше искать после этой позиции (если будут повторы этого же символа). Как только какой-то символ не найден – всё, не совпали.
Код
// write the function isAnagram
var isAnagram = function(test, original) {
  const length = original.length;

  if (length !== test.length) return false;

  const A = test.toLowerCase();
  const B = original.toLowerCase();
  const dict = {};

  for (let i=0, char, pos; i < length; i++) {
    char = A[i];
    pos = B.indexOf(char, +dict[char]);
    if (!~pos) return false;
    dict[char] = pos + 1;
  }

  return true;
};
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@Karpion
Я не понял вопроса. При чём тут анаграммы, если надо просто найти в массиве строки, совпадающие с заданной? Это простой перебор массива и сравнение строк на совпадение.
Ответ написан
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
.sort() - применять только после проверки абсолютного совпадения и совпадения равенства длин.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы