He actualizado esta respuesta. Me gusta más la idea de usar un partido, pero es más lento:
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
Use un literal de expresión regular si sabe de antemano lo que está buscando, si no puede usar el RegExp
constructor y pase la g
bandera como argumento.
match
vuelve null
sin resultados por lo tanto el|| []
La respuesta original que hice en 2009 está abajo. Crea una matriz innecesariamente, pero el uso de una división es más rápido (a partir de septiembre de 2014). Soy ambivalente, si realmente necesitara la velocidad, no habría duda de que usaría un split, pero preferiría usar match.
Antigua respuesta (de 2009):
Si estás buscando las comas:
(mainStr.split(",").length - 1) //3
Si buscas el str
(mainStr.split("str").length - 1) //4
Tanto en la respuesta de @ Lo como en mi propia tonta prueba de jsperf, la división se adelanta en velocidad, al menos en Chrome, pero una vez más, crear la matriz adicional simplemente no parece cuerdo.
Hay al menos cuatro formas. La mejor opción, que también debería ser la más rápida para el motor nativo RegEx, se coloca en la parte superior. jsperf.com está actualmente inactivo, de lo contrario, le proporcionaría estadísticas de rendimiento.
Actualización : por favor, encuentre las pruebas de rendimiento aquí y ejecútelas para contribuir con los resultados de su rendimiento. Los detalles de los resultados se darán más adelante.
1)
2)
División no recomendada. Recurso hambriento. Asigna nuevas instancias de 'Array' para cada partida. No intente eso para un archivo> 100 MB a través de FileReader. En realidad, puede observar fácilmente el uso EXACTO de los recursos utilizando el generador de perfiles de Chrome opción de .
3)
4)
buscando un solo personaje
Actualizar:
5)
mapeo y filtrado de elementos, no recomendado debido a la preasignación general de recursos en lugar de usar 'generadores' de Python
Compartir: hice esta esencia , con actualmente 8 métodos de conteo de personajes, para que podamos agrupar y compartir nuestras ideas directamente, solo por diversión y quizás algunos puntos de referencia interesantes :)
https://gist.github.com/2757250
fuente
||[]
estaba haciendo, ¡pero esta respuesta es genial! Para cualquier otra persona que se rasque la cabeza,match()
devuelvenull
si no se encuentran coincidencias y||[]
devolverá una matriz de longitud 0 si lasmatch()
devuelvenull
, lolength()
que significa que devolverá 0 en lugar de producir un error de tipo.index = -2
, pero muchas gracias @AugustusAgregue esta función al prototipo de picadura:
uso:
fuente
"stringsstringstrings".count("str")
?Una búsqueda rápida en Google obtuvo esto (de http://www.codecodex.com/wiki/index.php?title=Count_the_number_of_occurrences_of_a_specific_character_in_a_string#JavaScript )
Úselo así:
fuente
*
char (SyntaxError: nothing to repeat
)Simplemente, use la división para averiguar el número de ocurrencias de un personaje en una cadena.
mainStr.split(',').length
// da 4, que es el número de cadenas después de dividir usando la coma delimitadormainStr.split(',').length - 1
// da 3, que es el recuento de comasfuente
Aquí hay una solución similar, pero utiliza
Array.prototype.reduce
Como se mencionó,
String.prototype.split
funciona mucho más rápido queString.prototype.replace
.fuente
He descubierto que el mejor enfoque para buscar un carácter en una cadena muy grande (que tiene 1 000 000 caracteres, por ejemplo) es utilizar el
replace()
método.Puede ver otra suite JSPerf para probar este método junto con otros métodos para encontrar un carácter en una cadena.
fuente
También puede descansar su cadena y trabajar con ella como una matriz de elementos usando
O
fuente
Hice una pequeña mejora en la respuesta aceptada, permite verificar con una coincidencia entre mayúsculas y minúsculas y es un método adjunto al objeto de cadena:
lit
es la cadena a buscar (como 'ex'), y cis es insensible a mayúsculas y minúsculas, por defecto permitirá elegir coincidencias entre mayúsculas y minúsculas.Para buscar en la cadena
'I love StackOverflow.com'
la letra minúscula'o'
, usaría:amount_of_os
sería igual a2
.Si tuviéramos que buscar la misma cadena nuevamente usando una coincidencia entre mayúsculas y minúsculas, usaría:
Esta vez,
amount_of_os
sería igual a3
, ya que el capitalO
de la cadena se incluye en la búsqueda.fuente
ok, otro con regexp, probablemente no rápido, pero corto y mejor legible que otros, en mi caso solo
'_'
para contarsimplemente elimine todo lo que no se parece a su char pero no se ve bien con una cadena como entrada
fuente
Rendimiento de Split vs RegExp
fuente
La forma más fácil que descubrí ...
Ejemplo-
fuente
Estaba trabajando en un pequeño proyecto que requería un contador de subcadenas. La búsqueda de frases incorrectas no me dio resultados, sin embargo, después de escribir mi propia implementación, me topé con esta pregunta. De todos modos, aquí está mi camino, probablemente sea más lento que la mayoría aquí, pero podría ser útil para alguien:
http://jsfiddle.net/5ZzHt/1/
¡Avíseme si encuentra que esta implementación falla o no sigue algunos estándares! :)
ACTUALIZACIÓN Es posible que desee sustituir:
Con:
Lectura interesante sobre lo anterior: http://www.erichynds.com/blog/javascript-length-property-is-a-stored-value
fuente
Si está usando lodash, el método _.countBy hará esto:
Este método también funciona con una matriz:
fuente
Aquí está mi solución. Mucha solución ya publicada antes que yo. Pero me encanta compartir mi punto de vista aquí.
Aquí encontrarás mi REPL
fuente
El método más rápido parece ser a través del operador de índice:
O como una función prototipo:
fuente
Lo siguiente usa una expresión regular para probar la longitud. testex asegura que no tiene 16 o más caracteres consecutivos sin coma. Si pasa la prueba, procede a dividir la cadena. contar las comas es tan simple como contar las fichas menos una.
fuente
fuente
¿Qué pasa con string.split (nedCharecter) .length-1
Ejemplo:
var str = "hola como es la vida"; var len = str.split ("h"). longitud-1; dará el recuento 2 para el carácter "h" en la cadena anterior;
fuente
Estoy usando Node.js v.6.0.0 y el más rápido es el que tiene índice (el tercer método en la respuesta de Lo Sauer).
El segundo es:
fuente
Aquí hay uno casi tan rápido como los métodos de división y reemplazo, que son un poco más rápidos que el método regex (en cromo).
fuente
Acabo de hacer una prueba muy rápida y sucia en repl.it usando Node v7.4. Para un solo carácter, el estándar para el bucle es el más rápido:
Algún código :
Resultados de algunas ejecuciones :
fuente
Y ahí está:
Funciona con enteros también!
fuente
Mi solución:
fuente
String.prototype.match
devolucionesnull
sin coincidencias. Eso significa que no hay referencia a un objeto con unlength
atributo. En otras palabras:String.prototype.match.call('willnotwork', /yesitwill/) === null
El quinto método en la respuesta de Leo Sauers falla, si el personaje está al comienzo de la cadena. p.ej
dará 2 en lugar de 3, porque la función de filtro Boolean da falso para 0.
Otra posible función de filtro:
fuente
Sé que esta podría ser una vieja pregunta, pero tengo una solución simple para principiantes de bajo nivel en JavaScript.
Como principiante, solo podía entender algunas de las soluciones a esta pregunta, por lo que utilicé dos bucles FOR anidados para comparar cada carácter con cualquier otro carácter en la cadena, incrementando un recuento variable de para cada carácter encontrado que sea igual a ese carácter.
Creé un nuevo objeto en blanco donde cada clave de propiedad es un carácter y el valor es cuántas veces apareció cada carácter en la cadena (cuenta).
Función de ejemplo: -
fuente
Creo que encontrará la solución a continuación que es muy corta, muy rápida, capaz de trabajar con cadenas muy largas, capaz de admitir búsquedas de caracteres múltiples, a prueba de errores y capaz de manejar búsquedas de cadenas vacías.
Ejemplo de uso:
El código anterior corrige el error de rendimiento principal en Jakub Wawszczyk que el código sigue buscando una coincidencia incluso después de que indexOf dice que no hay ninguno y su versión en sí no funciona porque olvidó dar los parámetros de entrada de la función.
fuente
En javascript, puede usar el código anterior para obtener la aparición de un carácter en una cadena.
fuente
Mi solución con ramda js:
Enlace a REPL.
fuente
La función toma string str como parámetro y cuenta la aparición de cada carácter único en la cadena. El resultado viene en pares clave-valor para cada personaje.
fuente