Вероятно, было бы гораздо более кратким использовать регулярное выражение: сопоставить символ, а затем искать другие символы, пока вы не сможете снова сопоставить этот первый символ:
var letter = "SYAHSVCXCyXSssssssyBxAVMZsXhZV";
const firstRepeatedRegex = /(.)(?=.*\1)/;
console.log(letter.match(firstRepeatedRegex)[1]);
Конечно, если вы не уверены, содержит ли данная строка повторяющийся символ, убедитесь, что совпадение не равно нулю, прежде чем пытаться извлечь символ:
const input = 'abcde';
const firstRepeatedRegex = /(.)(?=.*\1)/;
const match = input.match(firstRepeatedRegex);
if (match) {
console.log(match[0]);
} else {
console.log('No repeated characters');
}
Вы также можете превратить ввод в массив и использовать .find
, чтобы найти первый символ, чей lastIndexOf
не совпадает с индексом итерируемого символа:
const getFirstRepeatedCharacter = (str) => {
const chars = [...str];
const char = chars.find((char, i) => chars.lastIndexOf(char) !== i);
return char || 'No repeated characters';
};
console.log(getFirstRepeatedCharacter('abcde'));
console.log(getFirstRepeatedCharacter('SYAHSVCXCyXSssssssyBxAVMZsXhZV'));
Если то, что вы на самом деле ищете, является символом, который встречается чаще всего без учета регистра, используйте reduce
для преобразования строки в объект, проиндексированный символом, значения которого являются числом вхождений этого символа, тогда определить наибольшее значение:
const getMostRepeatedCharacter = (str) => {
const charsByCount = [...str.toUpperCase()].reduce((a, char) => {
a[char] = (a[char] || 0) + 1;
return a;
}, {});
const mostRepeatedEntry = Object.entries(charsByCount).reduce((a, b) => a[1] >= b[1] ? a : b);
return mostRepeatedEntry[0];
};
console.log(getMostRepeatedCharacter('abcde'));
console.log(getMostRepeatedCharacter('SYAHSVCXCyXSssssssyBxAVMZsXhZV'));