Как сделать более сжатый код, используя оператор 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.`);

Другие вопросы по тегам