Ich weiß, dass ich hier zu spät dran bin, aber ich war ziemlich verblüfft, dass niemand diese Frage mit einem einfachen Ansatz beantwortet hat. Ein großer Teil der Antworten, die von der Gemeinschaft für diese Frage zur Verfügung gestellt werden, basieren auf Iteration, aber alle bewegen sich über Zeichenketten auf einer pro-Zeichen-Basis, die nicht wirklich effizient ist.
Bei einer großen Zeichenkette, die Tausende von Zeichen enthält, kann das Überfliegen jedes einzelnen Zeichens, um die Anzahl der Vorkommnisse zu ermitteln, ziemlich überflüssig werden, ganz zu schweigen von einem Code-Geruch. Die folgenden Lösungen nutzen die Vorteile von slice
, indexOf
und die bewährte traditionelle while
Schleife. Auf diese Weise müssen wir nicht jedes einzelne Zeichen durchgehen, und die Zählung der Vorkommen wird erheblich beschleunigt. Sie folgen einer ähnlichen Logik wie Parser und lexikalische Analysatoren, die Stringwalks benötigen.
Verwendung mit Slice
Bei diesem Ansatz nutzen wir slice
und mit jedem indexOf
Spiel werden wir uns durch die Kette bewegen und die zuvor gesuchten Tränke eliminieren. Jedes Mal, wenn wir indexOf
wird die Größe der gesuchten Zeichenfolge kleiner sein.
function countChar (char: string, search: string): number {
let num: number = 0;
let str: string = search;
let pos: number = str.indexOf(char);
while(pos > -1) {
str = str.slice(pos + 1);
pos = str.indexOf(char);
num++;
}
return num;
}
// Call the function
countChar('x', 'foo x bar x baz x') // 3
Verwendung mit IndexOf ab Position
Ähnlich wie bei dem ersten Ansatz mit slice
aber anstatt die gesuchte Zeichenkette zu erweitern, wird die from
Parameter in indexOf
método.
function countChar (char: string, str: string): number {
let num: number = 0;
let pos: number = str.indexOf(char);
while(pos > -1) {
pos = str.indexOf(char, pos + 1);
num++;
}
return num;
}
// Call the function
countChar('x', 'foo x bar x baz x') // 3
Ich persönlich ziehe den zweiten Ansatz dem ersten vor, aber beide sind gut und leistungsfähig, wenn es um große, aber auch um kleinere Zeichenketten geht.