Ich habe diese Antwort aktualisiert. Ich mag die Idee, ein Match besser zu verwenden, aber es ist langsamer:
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
Verwenden Sie ein Literal für reguläre Ausdrücke, wenn Sie vorher wissen, wonach Sie suchen. Wenn nicht, können Sie den RegExp
Konstruktor verwenden und das g
Flag als Argument übergeben.
match
kehrt null
ohne Ergebnisse zurück, also die|| []
Die ursprüngliche Antwort, die ich 2009 gegeben habe, ist unten. Es wird unnötig ein Array erstellt, aber die Verwendung eines Split ist schneller (Stand September 2014). Ich bin ambivalent, wenn ich die Geschwindigkeit wirklich brauchte, würde es keine Frage geben, dass ich einen Split verwenden würde, aber ich würde es vorziehen, Match zu verwenden.
Alte Antwort (von 2009):
Wenn Sie nach Kommas suchen:
(mainStr.split(",").length - 1) //3
Wenn Sie nach der str suchen
(mainStr.split("str").length - 1) //4
Sowohl in der Antwort von @ Lo als auch in meinem eigenen albernen jsperf-Test- Split kommt die Geschwindigkeit voran, zumindest in Chrome, aber das Erstellen des zusätzlichen Arrays scheint einfach nicht vernünftig zu sein.
Es gibt mindestens vier Möglichkeiten. Die beste Option, die auch für die native RegEx-Engine am schnellsten sein sollte, befindet sich oben. jsperf.com ist derzeit nicht verfügbar, andernfalls würde ich Ihnen Leistungsstatistiken zur Verfügung stellen.
Update : Bitte finden Sie die Leistungstests hier und führen Sie sie selbst aus, um Ihre Leistungsergebnisse beizutragen. Die Einzelheiten der Ergebnisse werden später angegeben.
1.
2.
Split nicht empfohlen. Ressourcenhungrig. Weist jeder Übereinstimmung neue Instanzen von 'Array' zu. Versuchen Sie das nicht für eine Datei mit> 100 MB über FileReader. Mit der Profiler- Option von Chrome können Sie die EXACT-Ressourcennutzung tatsächlich leicht beobachten .
3.
4.
Suche nach einem einzelnen Zeichen
Aktualisieren:
5.
Elementzuordnung und -filterung, aufgrund der allgemeinen Ressourcenvorbelegung nicht empfohlen, anstatt Python-Generatoren zu verwenden.
Teilen: Ich habe diesen Kern mit derzeit 8 Methoden zum Zählen von Charakteren erstellt, damit wir unsere Ideen direkt bündeln und teilen können - nur zum Spaß und vielleicht einige interessante Benchmarks :)
https://gist.github.com/2757250
quelle
||[]
ich tat, aber diese Antwort ist großartig! Für alle anderen, die sich am Kopf kratzen, wirdmatch()
zurückgegeben,null
wenn keine Übereinstimmungen gefunden wurden, und||[]
ein Array mit der Länge 0 zurückgegeben, wenn diematch()
Rückgabenull
erfolgt. Dies bedeutetlength()
, dass 0 zurückgegeben wird, anstatt einen Typfehler zu erzeugen.index = -2
, aber vielen Dank @AugustusFügen Sie diese Funktion dem Stachelprototyp hinzu:
Verwendungszweck:
quelle
"stringsstringstrings".count("str")
?Eine schnelle Google- Suche ergab dies (von http://www.codecodex.com/wiki/index.php?title=Count_the_number_of_occurrences_of_a_specific_character_in_a_string#JavaScript )
Verwenden Sie es so:
quelle
*
char (SyntaxError: nothing to repeat
)Verwenden Sie einfach die Aufteilung , um die Anzahl der Vorkommen eines Zeichens in einer Zeichenfolge zu ermitteln.
mainStr.split(',').length
// gibt 4 an, was die Anzahl der Zeichenfolgen nach dem Teilen mit einem Trennzeichen ist.mainStr.split(',').length - 1
// gibt 3 an, was die Anzahl der Kommas istquelle
Hier ist eine ähnliche Lösung, die jedoch verwendet wird
Array.prototype.reduce
Wie bereits erwähnt,
String.prototype.split
funktioniert viel schneller alsString.prototype.replace
.quelle
Ich habe festgestellt, dass der beste Ansatz für die Suche nach einem Zeichen in einer sehr großen Zeichenfolge (die beispielsweise 1 000 000 Zeichen lang ist) die Verwendung der
replace()
Methode ist.Sie können eine weitere JSPerf- Suite sehen, um diese Methode zusammen mit anderen Methoden zum Suchen eines Zeichens in einer Zeichenfolge zu testen.
quelle
Sie können Ihre Zeichenfolge auch ausruhen und wie ein Array von Elementen damit arbeiten
Oder
quelle
Ich habe die akzeptierte Antwort leicht verbessert. Sie ermöglicht die Überprüfung der Übereinstimmung zwischen Groß- und Kleinschreibung und ist eine Methode, die an das Zeichenfolgenobjekt angehängt ist:
lit
ist die Zeichenfolge, nach der gesucht werden soll (z. B. 'ex'), und cis ist Groß- und Kleinschreibung, standardmäßig false, und ermöglicht die Auswahl von Übereinstimmungen ohne Berücksichtigung der Groß- und Kleinschreibung.Um die Zeichenfolge
'I love StackOverflow.com'
nach dem Kleinbuchstaben zu durchsuchen'o'
, verwenden Sie:amount_of_os
wäre gleich2
.Wenn wir dieselbe Zeichenfolge erneut unter Verwendung der Übereinstimmung ohne Berücksichtigung der Groß- und Kleinschreibung durchsuchen würden, würden Sie Folgendes verwenden:
Diesmal
amount_of_os
wäre gleich3
, da das KapitalO
aus der Zeichenfolge in die Suche einbezogen wird.quelle
ok, ein anderer mit regulärem Ausdruck - wahrscheinlich nicht schnell, aber kurz und besser lesbar als andere, in meinem Fall nur um
'_'
zu zählenEntfernen Sie einfach alles, was nicht wie Ihr Zeichen aussieht, aber mit einer Zeichenfolge als Eingabe nicht gut aussieht
quelle
Leistung von Split vs RegExp
quelle
Der einfachste Weg, den ich herausgefunden habe ...
Beispiel-
quelle
Ich arbeitete an einem kleinen Projekt, für das ein Sub-String-Zähler erforderlich war. Die Suche nach den falschen Sätzen brachte mir keine Ergebnisse, aber nachdem ich meine eigene Implementierung geschrieben hatte, bin ich auf diese Frage gestoßen. Wie auch immer, hier ist mein Weg, es ist wahrscheinlich langsamer als die meisten hier, könnte aber für jemanden hilfreich sein:
http://jsfiddle.net/5ZzHt/1/
Bitte lassen Sie mich wissen, wenn Sie feststellen, dass diese Implementierung fehlschlägt oder einige Standards nicht befolgt! :) :)
UPDATE Möglicherweise möchten Sie Folgendes ersetzen:
Mit:
Interessante Lektüre über das Obige: http://www.erichynds.com/blog/javascript-length-property-is-a-stored-value
quelle
Wenn Sie lodash verwenden, führt die _.countBy- Methode Folgendes aus :
Diese Methode funktioniert auch mit Array:
quelle
Hier ist meine Lösung. Viele Lösungen wurden bereits vor mir veröffentlicht. Aber ich liebe es, meine Ansicht hier zu teilen.
Hier finden Sie meine REPL
quelle
Die schnellste Methode scheint über den Indexoperator zu sein:
Oder als Prototypfunktion:
quelle
Im Folgenden wird ein regulärer Ausdruck verwendet, um die Länge zu testen. testex stellt sicher, dass Sie nicht 16 oder mehr aufeinanderfolgende Nicht-Komma-Zeichen haben. Wenn es den Test besteht, wird die Zeichenfolge aufgeteilt. Das Zählen der Kommas ist so einfach wie das Zählen der Token minus eins.
quelle
quelle
Was ist mit string.split (gewünschterCharecter) .length-1
Beispiel:
var str = "hellow wie ist das Leben"; var len = str.split ("h"). length-1; gibt die Zählung 2 für das Zeichen "h" in der obigen Zeichenfolge;
quelle
Ich verwende Node.js v.6.0.0 und die schnellste ist die mit dem Index (die dritte Methode in Lo Sauers Antwort).
Der zweite ist:
quelle
Hier ist eine Methode, die fast so schnell ist wie die Split- und die Replace-Methode, die ein kleines bisschen schneller sind als die Regex-Methode (in Chrome).
quelle
Ich habe gerade einen sehr schnellen und schmutzigen Test auf repl.it mit Node v7.4 durchgeführt. Für ein einzelnes Zeichen ist der Standard für die Schleife am schnellsten:
Etwas Code :
Ergebnisse einiger Läufe :
quelle
Und da ist:
Funktioniert auch mit ganzen Zahlen!
quelle
Meine Lösung:
quelle
String.prototype.match
Rückgabenull
ohne Übereinstimmungen. Das heißt, kein Verweis auf ein Objekt mit einemlength
Attribut. Mit anderen Worten:String.prototype.match.call('willnotwork', /yesitwill/) === null
Die fünfte Methode in Leo Sauers Antwort schlägt fehl, wenn sich das Zeichen am Anfang der Zeichenfolge befindet. z.B
gibt 2 statt 3, weil die Filterfunktion Boolean false für 0 ergibt.
Andere mögliche Filterfunktion:
quelle
Ich weiß, dass dies eine alte Frage sein könnte, aber ich habe eine einfache Lösung für Anfänger auf niedrigem Niveau in JavaScript.
Als Anfänger konnte ich nur einige der Lösungen für diese Frage verstehen, also habe ich zwei verschachtelte verwendet FOR- Schleifen verwendet, um jedes Zeichen mit jedem anderen Zeichen in der Zeichenfolge zu vergleichen und die Anzahl zu erhöhen Variable für jedes Zeichen gefunden , die diesen Charakter entspricht.
Ich habe ein neues leeres Objekt erstellt, bei dem jeder Eigenschaftsschlüssel ein Zeichen ist und der Wert angibt, wie oft jedes Zeichen in der Zeichenfolge (Anzahl) vorkommt.
Beispielfunktion: -
quelle
Ich glaube, Sie werden feststellen, dass die folgende Lösung sehr kurz, sehr schnell ist, mit sehr langen Zeichenfolgen arbeiten kann, mehrere Zeichensuchen unterstützt, fehlerfrei ist und leere Zeichenfolgensuchen verarbeiten kann.
Anwendungsbeispiel:
Der obige Code behebt den Hauptleistungsfehler in Jakub Wawszczyks, dass der Code auch dann nach einer Übereinstimmung sucht, wenn indexOf angibt, dass es keine gibt und seine Version selbst nicht funktioniert, weil er vergessen hat, die Funktionseingabeparameter anzugeben.
quelle
In Javascript können Sie den obigen Code verwenden, um das Auftreten eines Zeichens in einer Zeichenfolge zu ermitteln.
quelle
Meine Lösung mit ramda js:
Link zu REPL.
quelle
Die Funktion verwendet die Zeichenfolge str als Parameter und zählt das Auftreten jedes eindeutigen Zeichens in der Zeichenfolge. Das Ergebnis ist ein Schlüssel-Wert-Paar für jedes Zeichen.
quelle