2
votes

Comptage de l'occurrence de caractères dans une chaîne javascript

J'ai écrit du code pour calculer le nombre de chacun des caractères d'une chaîne. Cela semble fonctionner correctement pour certains mots où, pour certains, cela échoue.

Cela échoue pour le dernier caractère, car je vois que la longueur de la chaîne devient plus petite que le nombre d'itérations (mais pour certains mots)

var str1 = "america"

function noofchars(str1) {
  for (var m = 0; m < str1.length + 1; m++) {
    var countno = 1;
    if (m != 0) {
      str1 = str1.slice(1)
    }

    str2 = str1.substr(0, 1)

    for (var i = 0; i < str1.length; i++) {
      if (str2 === str1.charAt(i + 1)) {
        countno += 1
        str1 = str1.slice(0, i + 1) + str1.slice(i + 2) + " "
      }
    }
    console.log(str1.charAt(0) + "=" + countno)
  }
}

var findnoofchar = noofchars(str1)

Ça passe pour Londres, Philadelphie, Sears, heureux Mais échoue pour l'Amérique, Chicago, etc. londres = l = 1, o = 2, n = 2, d = 1


8 commentaires

Qu'essayez-vous de trouver exactement? Un simple .length vous donne exactement cela.


N'aurait-il pas été plus simple d'utiliser string.length ?


@jhpratt L'OP tente de compter les occurrences de caractères spécifiques, pas toute la longueur de la chaîne. Par exemple: «bonjour» serait h = 1, e = 1, l = 2, o = 1.


Vous rendez votre travail beaucoup plus difficile qu'il ne devrait l'être. Ce n'est presque jamais une bonne idée de boucler quelque chose et de le modifier en même temps. La manière standard de procéder consiste à utiliser un objet dans lequel vous définissez les clés d'objet sur chaque lettre et augmentez la valeur chaque fois que vous voyez à nouveau la lettre. Il devrait y avoir beaucoup d'exemples de threads ici.


Les votes négatifs @Enthu indiquent que votre question n'est pas de qualité suffisante. Vous devriez être très surpris que votre question comporte trois votes positifs pour un seul vote défavorable. Votre question initiale était extrêmement floue - nous n'avons pas besoin d'attendre votre réponse pour voter, nous votons contre la question telle qu'elle était alors.


@jhpratt Je suis d'accord avec ça mais je l'avais édité en 1 minute pour être honnête, mais oui si le vote à bas vous satisfait, je suis heureux et je ne veux déranger personne, merci


@Enthu Downvoting n'est pas une question de satisfaction, il s'agit de signaler au PO qu'il doit résoudre sa question. L'info-bulle de vote défavorable est "Cette question ne montre aucun effort de recherche; elle n'est pas claire ou inutile"


Votre clarification minimale est arrivée quatre minutes après la publication. J'ai rétracté mon vote défavorable après cette heure. Je réponds simplement au fait que vous pensez que j'aurais dû attendre votre réponse (modifier) ​​avant de voter.


3 Réponses :


0
votes

Vous pouvez diviser la chaîne par chaque caractère puis compter le nombre d'occurrences de chaque caractère par la fonction réduire comme ci-dessous

var str1 = "america"

function noofchars(str1) {
  const len = str1.length;
  for (var m = 0; m < len; m++) {
    var countno = 1;
    if (m !== 0) {
      str1 = str1.slice(1)
    }
    if (str1.charAt(0) === ' ') {
      break;
    }
    str2 = str1.substr(0, 1)

    for (var i = 0; i < str1.length; i++) {
      if (str2 === str1.charAt(i + 1)) {
        countno += 1
        str1 = str1.slice(0, i + 1) + str1.slice(i + 2) + " "
      }
    }
    console.log(str1.charAt(0) + "=" + countno)
  }
}

var findnoofchar = noofchars(str1)

Dans votre solution, vous mutez str1 dans cette ligne

str1 = str1.slice(0, i + 1) + str1.slice(i + 2) + " "

qui modifie en fait la longueur de la chaîne et vérifie également str1.length dans la première boucle. Dans votre cas, vous pouvez prendre la longueur en premier lieu. La version de travail de votre extrait de code est ici

function noofchars(str1) {
  const chArray = str1.split('');
  return chArray.reduce(function(acc, ch) {
    if (acc[ch]) {
      acc[ch]++;
    } else {
      acc[ch] = 1;
    }
    return acc;
  }, {});
 }

 var str1 = "america";
 var findnoofchar = noofchars(str1);
 console.log(findnoofchar);


0 commentaires

5
votes

Il serait plus facile d'utiliser un objet. Commencez par réduire en nombre de caractères, puis parcourez les paires clé / valeur et console.log:

Object.keys(r).forEach(function(k) {...});

Syntaxe ES5:

}, {});

Il est plus facile de comprendre ce que fait reduction dans l'extrait ci-dessus.

Premièrement, nous prenons une fonction avec deux paramètres a code > et c . Ceux-ci peuvent être appelés n'importe quoi, j'utilise simplement a et c pour le a ccumulator et l'élément c urrent.

Maintenant, la deuxième ligne:

a[c] || 0

C'est assez difficile, alors décomposons-le. Regardons d'abord ce qui est entre parenthèses:

a[c] = (a[c] || 0) + 1;

Cela vérifie si a a une paire clé / valeur avec la clé c code> (comme dans, la valeur de c , pas la clé étant littéralement c ). Si cela n'existe pas, il renvoie 0 . Donc si a [c] existe, enregistrez-le comme valeur de l'expression, sinon utilisez 0.

Maintenant, nous ajoutons 1 , pour incrémenter la valeur.

Enfin, nous attribuons le résultat à a [c] . Donc, si a contenait c , la valeur de a [c] serait incrémentée. Si a ne contenait pas c , la valeur de a [c] serait 1 . P >

Ensuite, nous renvoyons a à utiliser dans la prochaine itération de reduce.

Dans la ligne suivante:

XXX

Nous attribuons une valeur par défaut pour a . Si nous ne faisions pas cela, lors de la première exécution de reduction , a serait "a" et c code > serait "m" (les deux premiers caractères de america ). De cette façon, a est {} (un objet vide) et c est "a" . Si nous n'avions pas ce deuxième argument, notre fonction ne fonctionnerait pas.

Dans cette ligne:

function noofchars(str1) {
  var r = str1.split("").reduce(function(a, c) {
    a[c] = (a[c] || 0) + 1;
    return a;
  }, {});
  Object.keys(r).forEach(function(k) {
    console.log(k + "=" + r[k]);
  });
}
noofchars("america");

Nous obtenons un tableau de toutes les clés de r , et les parcourir en boucle avec forEach , avec k étant la clé.

Ensuite, nous 'enregistrez k (la clé), puis un signe égal = , puis la valeur de r [k] code >.


3 commentaires

Pourriez-vous s'il vous plaît expliquer ce que fait réduire ici (car je comprends que réduire ajoute le résultat au cumulatif), ce serait vraiment utile, merci


Merci pour une explication aussi détaillée, je pense que je vais devoir revoir la fonction de réduction car je ne suis pas en mesure de comprendre comment fonctionne une paire clé / valeur [c], j'ai vu la fonction de réduction dans mdn mais jusqu'à ce jour, je ne comprends pas, Cela dit, j'accepterai la réponse et j'essaierai de comprendre, ce serait formidable si vous pouviez pointer vers n'importe quelle bonne ressource à partir de laquelle je pourrais mieux comprendre Réduire


Heureux d'avoir pu aider @Enthu. En voici un que j'ai trouvé utile: codeburst.io/... .



0
votes

Ne sachant pas vraiment ce que vous essayez d'accomplir avec votre code, une solution consiste à utiliser les fonctions charAt et Set. CharAt est un moyen plus direct d'itérer sur la chaîne et la fonction Set élimine automatiquement les caractères en double de l'ensemble.

<div id="displaySet"></div>
var str1 = "america";
    
      function noofchars(str1) {
        var charList = new Set();
        for (var m = 0; m < str1.length; m++) {
          
          var charX = str1.charAt(m).substr(0, 1);
          var countno = 1;
    
          for (var i = 0; i < str1.length; i++) {
            if (str1.slice(0, i + 1) == charX) {
              countno++;
            }
            charList.add(charX + "=" + countno);
          }
        }
        // you may need to expand set on Chrome console
        console.log(charList);
        // a hack to display more easily display on your screen
        var listOnScreen = Array.from(charList);
        document.getElementById('displaySet').innerHTML=listOnScreen;
      }
    
      noofchars(str1);


0 commentaires