Bonjour à tous,

Je voudrais écrire une fonction qui permet d'afficher le caractère qui revient le plus dans un mot.

J'ai réussi à compter le nombre de fois qu'un caractère revient dans le mot mais mon problème se situe au niveau de la comparaison, je ne trouve pas l'idée de comment comparer tous les résultats et prendre celui le plus élevé.

Exemple: mot = "barbapapa" // "a" est le caractère qui revient le plus de fois (4).

Voici le début de mon code.

function compteCharact(word){

  for(var i = 0; i < word.length; i++){

    var lettre = word.charAt(i);

    var tabSplit = word.split(lettre);
    var nbOccurence = tabSplit.length - 1;

  }
}

Auriez vous un indice à me donner pour comparer les nombres et prendre celui le plus élevé?

4 réponses


PhiSyX
Réponse acceptée

Tu peux clairement l'améliorer.
Les tableaux, tu peux directement utiliser .forEach par exemple. Les for/while c'est fini en 2017 :-D

function getHighCountChar (word) {
  if (!word) return "getHighCountChar - argument invalide"

  let caracteres = {};
  word.toLowerCase().split('').forEach((char) => {
    if (!caracteres.hasOwnProperty(char)) caracteres[char] = 0
    caracteres[char]++
  })

  const highcount = Object.keys(caracteres).sort((a, b) => caracteres[b] - caracteres[a])[0]
  return {
    char: highcount,
    count: caracteres[highcount]
  }
}

console.log(getHighCountChar())
console.log(getHighCountChar('barbapapa'))
console.log(getHighCountChar('Grafikart.fr'))

Je pense avoir trouvé mais je ne sais pas si c'est bien optimisé?

Qu'en dites vous?

function compteCharact(word){

  // DECLARATION DES MASK OU ON STOCKERA LA VALEUR LA PLUS GRANDE A CHAQUE FOIS;
  var mask = "";
  var maskNb = 0;

  // BOUCLE QUI PARCOURS LES CHARACTERE 
  for(var i = 0; i < word.length; i++){

  //  ON COMPTE LE NOMBRE D'OCCURENCE D'UNE LETTRE I DANS LE MOT
    var lettre = word.charAt(i);
    var tabSplit = word.split(lettre);
    var nbOccurence = tabSplit.length - 1;

  // ON BOUCLE POUR COMPARER LE NOMBRE D'OCCURENCE DE CETTE LETTRE AUX AUTRES NOMBRE D'OCCURENCES DES AUTRES LETTRES.

    for(var j = 0; j < word.length; j++){

      var comparLettre = word.charAt(j);
      var comparTabSplit = word.split(comparLettre);
      var comparNbOccurence = comparTabSplit.length -1;

// SI LE NOMBRE D'OCCURENCE DE CETTE LETTRE EST SUPERIEUR AUX AUTRES LETTRES, LE MASK PREND CETTE LETTRE COMME VALEUR. 
      if(nbOccurence > comparNbOccurence){
        mask = lettre;
        maskNb = nbOccurence;
      }
    }
  }
  document.write("La lettre qui revient le plus est " + mask + " ( " + maskNb + " x ) ");
}

Ha oui effectivement c'est bien mieux optimisé et propre :)

Merci à toi :)