Answer
t.me/js_testОтвет:
const anagram = (strA, strB) => {
const buildCharObject = (str) => {
const charObj = {};
for (let char of str.replace(/[^\w]/g).toLowerCase()) {
charObj[char] = charObj[char] + 1 || 1;
}
return charObj;
};
const aCharObject = buildCharObject(strA);
const bCharObject = buildCharObject(strB);
if (Object.keys(aCharObject).length !== Object.keys(bCharObject).length) {
return false;
}
for (let char in aCharObject) {
if (aCharObject[char] !== bCharObject[char]) {
return false;
}
}
return true;
};
Обьяснение:
Для хранения данных анаграммы стоит выбрать такую структуру, как объектный литерал JavaScript. Ключ в этом случае — символ буквы, значение — количество ее повторений в текущей строке.
Есть и другие условия:
- Нужно убедиться в том, что регистр букв при сравнении не учитывается. Просто преобразуем обе строки в нижний или верхний регистр.
- Исключаем из сравнения все не-символы. Лучше всего работать с регулярными выражениями.
Обратите внимание на использование Object.keys() в ответе. Этот метод возвращает массив, содержащий имена или ключи в таком же порядке, в каком они встречаются в объекте. В этом случае массив будет таким:
[‘f’, ‘i’, ’n’, ‘d’, ‘e’, ‘r’]
Таким образом, мы получаем свойства объекта без необходимости выполнять объемный цикл. В задаче можно использовать этот способ со свойством .length — для проверки того, есть ли в обеих строках одинаковое количество символов — это важная особенность анаграмм.
Код для проверки:
const anagram = (strA, strB) => {
const buildCharObject = (str) => {
const charObj = {};
for (let char of str.replace(/[^\w]/g).toLowerCase()) {
charObj[char] = charObj[char] + 1 || 1;
}
return charObj;
};
const aCharObject = buildCharObject(strA);
const bCharObject = buildCharObject(strB);
if (Object.keys(aCharObject).length !== Object.keys(bCharObject).length) {
return false;
}
for (let char in aCharObject) {
if (aCharObject[char] !== bCharObject[char]) {
return false;
}
}
return true;
};
console.log(anagram('finder', 'Friend')); //true
console.log(anagram('hello', 'bye')); //false