JS Проверка массива слов на анаграммы с помощью функции

Необходимо написать функцию checkAnagram, которая будет проверять, являются ли перечисленные слова в массиве анаграммами.

Аргументом функции checkAnagram является массив строк, которые нужно проверить.

Возвращаемое значение — true/false в зависимости от того можно ли все слова массива составить из одних и тех же букв.


Ответы (3 шт):

Автор решения: lost_keeper

Вроде работает, но если это полотно возможно оптимизировать, не откажусь от советов :D

    function checkAnagram(anagramArray) {
        let total = 0;
        if (anagramArray == 0 || anagramArray.length == 1)
            total = false;
        else{
            for (let i = 0; i < anagramArray.length; i++) {
                let firstWord = anagramArray[0].split("").sort().join("");
                if (anagramArray[i].split("").sort().join("") == firstWord) {
                total = true;
                } else
                total = false;
            }
        }
        return total;
    }
→ Ссылка
Автор решения: Zhihar

можно вот такой вариант:

const is_correct = arr.filter(obj => obj.split('').sort().join('').localeCompare(arr[0].split('').sort().join('')) === 0).length === arr.length;
→ Ссылка
Автор решения: OPTIMUS PRIME

Ваш вариант, немного подправленный (дополнительная переменная была не нужна):

console.log(checkAnagram(["aabbcc", "ababcc", "abcabc"])); // true
console.log(checkAnagram(["aabbcc", "ababcF", "abcabc"])); // false

function checkAnagram(arr) {
  if (!arr || arr.length <= 1) return false;
  // Нет массива, или её длина 0 или 1, сразу на выход.
  
  let first_word = arr[0].split("").sort().join("");
  
  for (let i = 1; i < arr.length; i++) {
    // от i = 1, не 0
    if (arr[i].split("").sort().join("") != first_word) {
      // Если вдруг [i]-тый элемент оказался не равным, можно не продолжать цикл
      return false;
      // Прямо отсюда выйти из функции, вернув false.      
    }
  }
  
  return true;
  // Цикл добежал и не прервался, значит все слова оказались равны
}

Можно еще взять и посчитать количество букв:

console.log(checkAnagram(["aabbcc", "ababcc", "abcabc"])); // true
console.log(checkAnagram(["aabbcc", "ababcF", "abcabc"])); // false

function checkAnagram(arr) {
  if (!arr || arr.length <= 1) return false;
  
  let wordSize = arr[0].length;
  let wordLetters = countLetters(arr[0]);
  
  console.log( wordLetters ); 
  
  for (let i = 1; i < arr.length; i++) {
    if (arr[i].length != wordSize) return false; // Ширина не равна - до свидания
    
    let currLetters = countLetters(arr[i]);
    
    for (let letter in wordLetters) { // бежит по буквам эталонного слова
      if (wordLetters[letter] != currLetters[letter]) return false;
      // Все буквы, что были там, должны быть и в currLetters, в том же кол-ве.
    }
  }
  
  return true;
  
  /***/
  function countLetters(str) {
    let dictionary = {};
    
    for (let letter of str) {
      dictionary[letter] = (dictionary[letter] || 0) + 1;
      // dictionary[letter] — undefined? (буква не встречалась || возьмется 0) + 1
    }
    
    return dictionary;
  }
}

→ Ссылка