J'ai mis à jour cette réponse. J'aime l'idée d'utiliser un match mieux, mais c'est plus lent:
console.log(("str1,str2,str3,str4".match(/,/g) || []).length); //logs 3
console.log(("str1,str2,str3,str4".match(new RegExp("str", "g")) || []).length); //logs 4
jsfiddle
Utilisez un littéral d'expression régulière si vous savez ce que vous recherchez à l'avance, sinon vous pouvez utiliser le RegExp
constructeur et passez l' g
indicateur comme argument.
match
retourne null
sans résultat ainsi la|| []
La réponse originale que j'ai faite en 2009 est ci-dessous. Il crée un tableau inutilement, mais l' utilisation d'un fractionnement est plus rapide (à partir de septembre 2014). Je suis ambivalent, si j'avais vraiment besoin de la vitesse, il n'y aurait aucun doute que j'utiliserais un split, mais je préférerais utiliser match.
Ancienne réponse (de 2009):
Si vous recherchez les virgules:
(mainStr.split(",").length - 1) //3
Si vous cherchez le str
(mainStr.split("str").length - 1) //4
Tant dans la réponse de @ Lo que dans mon propre split de test jsperf idiot vient en avant en vitesse, au moins dans Chrome, mais encore une fois, la création du tableau supplémentaire ne semble pas raisonnable.
Il y a au moins quatre façons. La meilleure option, qui devrait également être la plus rapide grâce au moteur RegEx natif, est placée en haut. jsperf.com est actuellement en panne, sinon je vous fournirais des statistiques de performances.
Mise à jour : Veuillez trouver les tests de performances ici et exécutez-les vous-même, afin de contribuer à vos résultats de performances. Les détails des résultats seront donnés ultérieurement.
1.
2.
split non recommandé. Affamé de ressources. Alloue de nouvelles instances de «tableau» pour chaque correspondance. N'essayez pas cela pour un fichier> 100 Mo via FileReader. Vous pouvez en fait facilement observer l'utilisation des ressources EXACT en utilisant l' option de profileur de Chrome .
3.
4.
recherche d'un seul caractère
Mise à jour:
5.
mappage et filtrage des éléments, déconseillés en raison de la préallocation globale des ressources plutôt que d'utiliser des «générateurs» pythoniens
Partager: J'ai créé cet aperçu , avec actuellement 8 méthodes de comptage de caractères, afin que nous puissions directement mettre en commun et partager nos idées - juste pour le plaisir, et peut-être quelques repères intéressants :)
https://gist.github.com/2757250
la source
||[]
passait mais cette réponse est géniale! Pour toute autre personne se grattant la tête,match()
retournenull
si aucune correspondance n'est trouvée et||[]
retournera un tableau de longueur 0 si lematch()
retournenull
, celength()
qui signifie retournera 0 au lieu de produire une erreur de type.index = -2
, mais merci beaucoup @AugustusAjoutez cette fonction au prototype sting:
usage:
la source
"stringsstringstrings".count("str")
?Une recherche rapide sur Google a obtenu ceci (depuis http://www.codecodex.com/wiki/index.php?title=Count_the_number_of_occurrences_of_a_specific_character_in_a_string#JavaScript )
Utilisez-le comme ceci:
la source
*
char (SyntaxError: nothing to repeat
)Utilisez simplement le fractionnement pour connaître le nombre d'occurrences d'un caractère dans une chaîne.
mainStr.split(',').length
// donne 4 qui est le nombre de chaînes après la séparation en utilisant la virgule délimiteurmainStr.split(',').length - 1
// donne 3 qui est le nombre de virgulesla source
Voici une solution similaire, mais elle utilise
Array.prototype.reduce
Comme cela a été mentionné,
String.prototype.split
fonctionne beaucoup plus rapidement queString.prototype.replace
.la source
J'ai trouvé que la meilleure approche pour rechercher un caractère dans une très grande chaîne (c'est-à-dire 1 000 000 de caractères par exemple) est d'utiliser la
replace()
méthode.Vous pouvez voir encore une autre suite JSPerf pour tester cette méthode ainsi que d'autres méthodes de recherche d'un caractère dans une chaîne.
la source
Vous pouvez également reposer votre chaîne et travailler avec elle comme un tableau d'éléments en utilisant
Ou
la source
J'ai apporté une légère amélioration à la réponse acceptée, cela permet de vérifier avec une correspondance sensible à la casse / insensible à la casse, et est une méthode attachée à l'objet chaîne:
lit
est la chaîne à rechercher (comme 'ex'), et cis est insensible à la casse, par défaut à false, il permettra de choisir des correspondances insensibles à la casse.Pour rechercher la chaîne
'I love StackOverflow.com'
de la lettre minuscule'o'
, vous utiliseriez:amount_of_os
serait égal à2
.Si nous devions rechercher à nouveau la même chaîne en utilisant une correspondance insensible à la casse, vous utiliseriez:
Cette fois,
amount_of_os
serait égal à3
, car le capitalO
de la chaîne est inclus dans la recherche.la source
ok, un autre avec regexp - probablement pas rapide, mais court et mieux lisible que les autres, dans mon cas juste
'_'
pour compteril suffit de supprimer tout ce qui ne ressemble pas à votre caractère mais il n'a pas l'air sympa avec une chaîne en entrée
la source
Performances de Split vs RegExp
la source
Le moyen le plus simple que j'ai découvert ...
Exemple-
la source
Je travaillais sur un petit projet qui nécessitait un compteur de sous-chaînes. La recherche des phrases erronées ne m'a donné aucun résultat, mais après avoir écrit ma propre implémentation, je suis tombé sur cette question. Quoi qu'il en soit, voici mon chemin, il est probablement plus lent que la plupart ici, mais pourrait être utile à quelqu'un:
http://jsfiddle.net/5ZzHt/1/
Veuillez me faire savoir si vous trouvez que cette implémentation échoue ou ne respecte pas certaines normes! :)
MISE À JOUR Vous pouvez remplacer:
Avec:
Lecture intéressante discutant de ce qui précède: http://www.erichynds.com/blog/javascript-length-property-is-a-stored-value
la source
Si vous utilisez lodash, la méthode _.countBy fera cela:
Cette méthode fonctionne également avec le tableau:
la source
Voici ma solution. Beaucoup de solutions déjà affichées devant moi. Mais j'aime partager mon point de vue ici.
Ici vous trouvez mon REPL
la source
La méthode la plus rapide semble être via l'opérateur d'index:
Ou comme fonction prototype:
la source
Ce qui suit utilise une expression régulière pour tester la longueur. testex garantit que vous ne disposez pas de 16 caractères non virgule consécutifs ou plus. S'il réussit le test, il procède à la division de la chaîne. compter les virgules est aussi simple que compter les jetons moins un.
la source
la source
Qu'en est-il de string.split (desireCharecter) .length-1
Exemple:
var str = "hellow how is life"; var len = str.split ("h"). length-1; donnera le compte 2 pour le caractère "h" dans la chaîne ci-dessus;
la source
J'utilise Node.js v.6.0.0 et le plus rapide est celui avec index (la 3ème méthode dans la réponse de Lo Sauer).
Le second est:
la source
En voici une presque aussi rapide que les méthodes de fractionnement et de remplacement, qui sont un peu plus rapides que la méthode regex (en chrome).
la source
Je viens de faire un test très rapide et sale sur repl.it en utilisant Node v7.4. Pour un seul caractère, la norme de boucle est la plus rapide:
Du code :
Résultats de quelques essais :
la source
Et voici:
Fonctionne aussi avec des entiers!
la source
Ma solution:
la source
String.prototype.match
retoursnull
sans correspondances. Cela signifie aucune référence à un objet avec unlength
attribut. En d'autres termes:String.prototype.match.call('willnotwork', /yesitwill/) === null
La cinquième méthode dans la réponse de Leo Sauers échoue, si le caractère se trouve au début de la chaîne. par exemple
donnera 2 au lieu de 3, car la fonction de filtre booléen donne false pour 0.
Autre fonction de filtrage possible:
la source
Je sais que cela pourrait être une vieille question, mais j'ai une solution simple pour les débutants de bas niveau en JavaScript.
En tant que débutant, je ne pouvais comprendre que certaines des solutions à cette question, j'ai donc utilisé deux boucles FOR imbriquées pour comparer chaque caractère par rapport à tous les autres caractères de la chaîne, en incrémentant un nombre variable de pour chaque caractère trouvé égal à ce caractère.
J'ai créé un nouvel objet vide où chaque clé de propriété est un caractère et la valeur est le nombre de fois que chaque caractère est apparu dans la chaîne (count).
Exemple de fonction: -
la source
Je pense que vous trouverez la solution ci-dessous très courte, très rapide, capable de travailler avec de très longues chaînes, capable de prendre en charge plusieurs recherches de caractères, résistante aux erreurs et capable de gérer des recherches de chaînes vides.
Exemple d'utilisation:
Le code ci-dessus corrige le bogue de performance majeur dans Jakub Wawszczyk que le code continue à rechercher une correspondance même après que indexOf indique qu'il n'y en a pas et que sa version elle-même ne fonctionne pas car il a oublié de donner les paramètres d'entrée de la fonction.
la source
En javascript, vous pouvez utiliser le code ci-dessus pour obtenir l'occurrence d'un caractère dans une chaîne.
la source
Ma solution avec ramda js:
Lien vers REPL.
la source
La fonction prend la chaîne str comme paramètre et compte l'occurrence de chaque caractère unique dans la chaîne. Le résultat est fourni par paire clé-valeur pour chaque caractère.
la source