"Escriba una función de JavaScript para obtener el número de apariciones de cada letra en la cadena especificada". Lo intenté de esta manera, pero todas mis salidas son 0 y realmente no entiendo por qué.

Mi idea era: orden alfabético, por lo que si una letra es igual a la siguiente, el contador aumenta. Cuando no es lo mismo, registra la letra, cuántas veces aparece y restablece el contador.

Por cierto, no sé cómo hacer que lea las letras que aparecen solo una vez. ¿Puede usted ayudar?

function count(string) {
  let string1 = string.split("").sort().join("");
  let counter = 0;
  for (let i = 0; i < string.length; i++) {
    if (string1[i] == string[i + 1]) {
      counter++;
    } else {
      console.log(string1[i] + " " + counter);
      counter = 0;
    }
  }
}
count("thequickbrownfoxjumpsoverthelazydog");
0
f0rta 28 feb. 2018 a las 20:59

3 respuestas

La mejor respuesta

Dos errores menores en su código.

  • La condición coincidente debe ser string1[i] == string1[i + 1]
  • Inicie contadores con valor 1 ya que cada valor ocurrirá al menos una vez.
function count(string) {
  let string1 = string.split("").sort().join("");
  let counter = 1;
  for (let i = 0; i < string.length; i++) {
    if (string1[i] == string1[i + 1]) {
      counter++;
    } else {
      console.log(string1[i] + " " + counter);
      counter = 1;
    }
  }
}
count("thequickbrownfoxjumpsoverthelazydog");

Le sugiero que utilice un enfoque diferente que utilizará .reduce y devolverá un buen objeto de los recuentos.

function count(string) {
  return string.split("").reduce(
    (acc, el) => {
      if(acc.hasOwnProperty(el))
        acc[el]++;
      else
        acc[el] = 1;
      return acc;
    }, {}
  )
}
var data = count("thequickbrownfoxjumpsoverthelazydog");
console.log(data);
2
void 28 feb. 2018 a las 18:07

Puedes hacerlo así

function count(text){
  var i = 0;
  var j = 0;
  var chars = new Array();
  var occurs = new Array();

  for(i = 0;i < text.length;i++){
    //save current char
    chars.push(text[i]);

    //get occurences
    occurs.push(countOccurs(text, text[i]));
  }

  //clean for duplicates
  for(i = 0;i < chars.length;i++){
    for(j = (i + 1);j < chars.length;j++){
      if(chars[i] == chars[j]){
        chars[j] = "";
        occurs[j] = 0;
      }
    }
  }

  //print it!
  for(i = 0;i < chars.length;i++){
    if(chars[i] != '')
      console.log("The char " + chars[i] + " appears " + occurs[i] + " times.");
  }
}

function countOccurs(text, character){
  var i = 0;
  var ret = 0;

  for(i = 0;i < text.length;i++)
    if(text[i] == character)
      ret++

  return ret;
}

count("abcdefabcd");

Entonces, solo cuenta cada ocurrencia de caracteres y luego limpia las matrices.

0
David 28 feb. 2018 a las 18:33

Use la función reduce para evitar el problema con una sola ocurrencia.

function count(string) {
  return string.split("").reduce((a, letter) => {
    a[letter] = (a[letter] || 0) + 1;
    return a;
  }, {});
}
console.log(count("thequickbrownfoxjumpsoverthelazydog"));
.as-console-wrapper { max-height: 100% !important; top: 0; }

Fragmento con explicación

function count(string) {
  return string.split("").reduce((a, letter) => {
    var currentCount = a[letter];
    if (currentCount) { 
      currentCount = currentCount + 1; // If previously counted + 1
    } else {
      currentCount = 1; // Else initialize with first occurence.
    }
    
    a[letter] = currentCount; //Store the new count.
    
    return a;
  }, {});
}

console.log(count("thequickbrownfoxjumpsoverthelazydog"));

Recurso

2
Ele 28 feb. 2018 a las 18:14