Как сделать более сжатый код, используя оператор For?
Я новичок в Stackru и JavaScript, я пытаюсь получить первую букву, которая повторяется из строки, учитывающей как прописные, так и строчные буквы, а также подсчет и получение результатов с помощью оператора for. Проблема в том, что форма, которую я использовал, слишком длинная. Анализ ситуации доходит до такой точки, что, возможно, вы можете использовать только выражение "For" для этого упражнения, которое я получу для итерации, но не с более чистым и сокращенным кодом. заблокирован, поэтому я прошу помочь понять и продолжить понимание и использование этого предложения. В этом случае результат был протестирован в сценарии JavaScript внутри функции и 3 предложения "For", получая весьма положительные результаты, но я не могу создать его только в 1 For (извините за мой плохой английский переводчик Google)
Я сделал в HTML с JavasScript
var letter = "SYAHSVCXCyXSssssssyBxAVMZsXhZV";
var contendor = [];
var calc = [];
var mycalc = 0;
letter = letter.toUpperCase()
console.log(letter)
function repeats(){
for (var i = 0; i < letter.length; i++) {
if (contendor.includes(letter[i])) {
}else{
contendor.push(letter[i])
calc.push(0)
}
}
for (var p = 0; p < letter.length; p++) {
for (var l = 0; l < contendor.length; l++) {
if (letter[p] == contendor[l]) {
calc [l]= calc [l]+1
}
}
}
for (var f = 0; f < calc.length; f++) {
if ( calc[f] > calc[mycalc]) {
mycalc = f
}
}
}
repeats()
console.log("The most repeated letter its: " + contendor[mycalc]);
Я ожидал: результат с кратким кодом
4 ответа
Вероятно, было бы гораздо более кратким использовать регулярное выражение: сопоставить символ, а затем искать другие символы, пока вы не сможете снова сопоставить этот первый символ:
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'));
Если вам нужен первый повторяющийся символ, вы можете поместить его в массив и проверить, существует ли уже этот символ
function getFirstRepeating( str ){
chars = []
for ( var i = 0; i < str.length; i++){
var char = str.charAt(i);
if ( chars.includes( char ) ){
return char;
} else {
chars.push( char );
}
}
return -1;
}
Это вернет первый повторяющийся символ, если он существует, или вернет -1.
За работой
function getFirstRepeating( str ){
chars = []
for ( var i = 0; i < str.length; i++){
var char = str.charAt(i);
if ( chars.includes( char ) ){
return char;
} else {
chars.push( char );
}
}
return -1;
}
console.log(getFirstRepeating("SYAHSVCXCyXSssssssyBxAVMZsXhZV"))
Вы уже работали с объектами JavaScript?
Вы должны посмотреть на это.
Когда вы перебираете свою строку
let characters = "hemdhdksksbbd";
let charCount = {};
let max = { count: 0, ch: ""}; // will contain max
// rep letter
//Turn string into an array of letters and for
// each letter create a key in the charcount
// object , set it to 1 (meaning that's the first of
// that letter you've found) and any other time
// you see the letter, increment by 1.
characters.split("").forEach(function(character)
{
if(!charCount[character])
charCount[character] = 1;
else
charCount[character]++;
}
//charCount should now contain letters and
// their counts.
//Get the letters from charCount and find the
// max count
Object.keys(charCount). forEach (function(ch){
if(max.count < charCount[ch])
max = { count: charCount[ch], ch: ch};
}
console.log("most reps is: " , max.ch);
Это довольно ужасное решение. Требуется 2 петли (reduce
) и не обрабатывает галстуки, но он короткий и сложный.
В основном продолжайте превращать результаты в массивы и использовать методы массива split
а также reduce
найти ответ. Первый reduce
завернут в Object.entries()
превратить объект обратно в массив.
let letter = Object.entries(
"SYAHSVCXCyXSssssssyBxAVMZsXhZV".
toUpperCase().
split('').
reduce((p, c) => {
p[c] = isNaN(++p[c]) ? 1 : p[c];
return p;
}, {})
).
reduce((p, c) => p = c[1] > p[1] ? c : p);
console.log(`The most repeated letter is ${letter[0]}, ${letter[1]} times.`);