Eu atualizei esta resposta. Eu gosto mais da ideia de usar uma partida, mas é mais lenta:
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 uma expressão regular literal se souber o que está pesquisando anteriormente; caso contrário, poderá usar o RegExp
construtor e passar a g
flag como argumento.
match
retorna null
sem resultados, portanto, o|| []
A resposta original que fiz em 2009 está abaixo. Ele cria uma matriz desnecessariamente, mas o uso de uma divisão é mais rápido (em setembro de 2014). Sou ambivalente, se eu realmente precisasse da velocidade, não haveria dúvida de que usaria uma divisão, mas preferiria usar a partida.
Resposta antiga (de 2009):
Se você estiver procurando por vírgulas:
(mainStr.split(",").length - 1) //3
Se você está procurando o str
(mainStr.split("str").length - 1) //4
Tanto na resposta do @ Lo quanto no meu bobo jsperf, o teste vem à frente em velocidade, pelo menos no Chrome, mas novamente criar a matriz extra não parece sensato.
Existem pelo menos quatro maneiras. A melhor opção, que também deve ser a mais rápida para o mecanismo RegEx nativo -, é colocada no topo. O jsperf.com está desativado no momento, caso contrário, eu forneceria estatísticas de desempenho.
Atualização : encontre aqui os testes de desempenhoe execute-os, para contribuir com seus resultados de desempenho. As especificidades dos resultados serão fornecidas posteriormente.
1
2)
divisão não recomendada. Com fome de recursos. Aloca novas instâncias de 'Matriz' para cada correspondência. Não tente isso para um arquivo> 100 MB via FileReader. Você pode observar facilmente o uso EXATO dos recursos usando a opção de criação de perfil do Chrome .
3)
4)
procurando um único caractere
Atualizar:
5)
mapeamento e filtragem de elementos, não recomendado devido à sua pré-localização geral de recursos, em vez de usar 'geradores' do Python
Compartilhe: Eu criei essa essência , com atualmente 8 métodos de contagem de caracteres, para que possamos compartilhar e compartilhar nossas idéias diretamente - apenas por diversão, e talvez por algumas referências interessantes :)
https://gist.github.com/2757250
fonte
||[]
estava fazendo, mas essa resposta é ótima! Para qualquer outra pessoa que coça a cabeça,match()
retornanull
se nenhuma correspondência for encontrada e||[]
retornará uma matriz de comprimento 0 sematch()
retornarnull
, oulength()
seja, retornará 0 em vez de produzir um erro de tipo.index = -2
, mas muito obrigado @AugustusAdicione esta função ao protótipo de picada:
uso:
fonte
"stringsstringstrings".count("str")
?Uma rápida pesquisa no Google conseguiu isso (em http://www.codecodex.com/wiki/index.php?title=Count_the_number_of_occurrences_of_a_specific_character_in_a_string#JavaScript )
Use-o assim:
fonte
*
char (SyntaxError: nothing to repeat
)Simplesmente, use a divisão para descobrir o número de ocorrências de um caractere em uma string.
mainStr.split(',').length
// fornece 4, que é o número de cadeias após a divisão usando vírgula delimitadoramainStr.split(',').length - 1
// fornece 3, que é a contagem de vírgulafonte
Aqui está uma solução semelhante, mas ela usa
Array.prototype.reduce
Como foi mencionado,
String.prototype.split
funciona muito mais rápido queString.prototype.replace
.fonte
Descobri que a melhor abordagem para procurar um caractere em uma string muito grande (com 1 000 000 caracteres, por exemplo) é usar o
replace()
métodoVocê pode ver ainda outro conjunto JSPerf para testar esse método, juntamente com outros métodos para localizar um caractere em uma sequência.
fonte
Você também pode descansar sua string e trabalhar com ela como uma matriz de elementos usando
Ou
fonte
Fiz uma pequena melhoria na resposta aceita, ela permite verificar com correspondência sensível a maiúsculas / minúsculas e é um método anexado ao objeto string:
lit
é a string a ser pesquisada (como 'ex') e cis não faz distinção entre maiúsculas e minúsculas, o padrão é false, permitirá a escolha de correspondências sem distinção entre maiúsculas e minúsculas.Para pesquisar a string
'I love StackOverflow.com'
pela letra minúscula'o'
, você usaria:amount_of_os
seria igual a2
.Se procurássemos a mesma sequência novamente usando a correspondência que não diferencia maiúsculas de minúsculas, você usaria:
Dessa vez,
amount_of_os
seria igual a3
, já que o capitalO
da sequência é incluído na pesquisa.fonte
ok, outro com regexp - provavelmente não é rápido, mas curto e melhor legível que outros, no meu caso apenas
'_'
para contarbasta remover tudo o que não se parece com o seu caractere, mas não fica bonito com uma string como entrada
fonte
Desempenho de Split vs RegExp
fonte
A maneira mais fácil que eu descobri ...
Exemplo-
fonte
Eu estava trabalhando em um pequeno projeto que exigia um contador de sub-string. A pesquisa de frases erradas não me forneceu resultados; no entanto, depois de escrever minha própria implementação, me deparei com essa pergunta. Enfim, aqui está o meu caminho, provavelmente é mais lento que a maioria aqui, mas pode ser útil para alguém:
http://jsfiddle.net/5ZzHt/1/
Informe-me se você encontrar esta implementação com falha ou se não seguir alguns padrões! :)
ATUALIZAÇÃO Você pode substituir:
Com:
Leitura interessante discutindo o acima: http://www.erichynds.com/blog/javascript-length-property-is-a-stored-value
fonte
Se você estiver usando lodash, o método _.countBy fará isso:
Este método também trabalha com array:
fonte
Aqui está a minha solução. Muitas soluções já postadas antes de mim. Mas eu amo compartilhar minha opinião aqui.
Aqui você encontra o meu REPL
fonte
O método mais rápido parece ser através do operador de índice:
Ou como uma função de protótipo:
fonte
A seguir, uma expressão regular para testar o comprimento. O testex garante que você não tenha 16 ou mais caracteres consecutivos sem vírgula. Se passar no teste, ele continuará dividindo a sequência. contar as vírgulas é tão simples quanto contar os tokens menos um.
fonte
fonte
E quanto a string.split (gráfico desejado) .length-1
Exemplo:
var str = "abaixo, como está a vida"; var len = str.split ("h"). length-1; dará a contagem 2 para o caractere "h" na string acima;
fonte
Estou usando o Node.js. v.6.0.0 e o mais rápido é o que possui um índice (o terceiro método na resposta de Lo Sauer).
O segundo é:
fonte
Aqui está um quase tão rápido quanto os métodos de divisão e substituição, que são um pouco mais rápidos que o método regex (no chrome).
fonte
Acabei de fazer um teste muito rápido e sujo no repl.it usando o Node v7.4. Para um único caractere, o loop for padrão é o mais rápido:
Algum código :
Resultados de algumas execuções :
fonte
E aqui está:
Funciona com números inteiros também!
fonte
Minha solução:
fonte
String.prototype.match
retornosnull
sem correspondências. Isso significa que não há referência a um objeto com umlength
atributo. Em outras palavras:String.prototype.match.call('willnotwork', /yesitwill/) === null
O quinto método na resposta de Leo Sauers falha, se o caractere estiver no início da string. por exemplo
dará 2 em vez de 3, porque a função de filtro Boolean fornece false para 0.
Outra função de filtro possível:
fonte
Sei que essa pode ser uma pergunta antiga, mas tenho uma solução simples para iniciantes de baixo nível em JavaScript.
Como iniciante, eu só conseguia entender algumas das soluções para essa pergunta, então usei dois loops FOR aninhados para verificar cada caractere contra qualquer outro caractere na cadeia, incrementando uma variável de contagem para cada caractere encontrado igual a esse caractere.
Criei um novo objeto em branco em que cada chave de propriedade é um caractere e o valor é quantas vezes cada caractere apareceu na sequência (contagem).
Exemplo de função: -
fonte
Acredito que você achará a solução abaixo muito curta, muito rápida, capaz de trabalhar com seqüências muito longas, capaz de oferecer suporte a pesquisas de vários caracteres, à prova de erros e capaz de lidar com pesquisas de cadeias vazias.
Exemplo de uso:
O código acima corrige o principal bug de desempenho do Jakub Wawszczyk, que o código continua procurando uma correspondência mesmo depois que o indexOf diz que não há nenhum e sua versão em si não está funcionando porque ele esqueceu de fornecer os parâmetros de entrada da função.
fonte
Em javascript, você pode usar o código acima para obter a ocorrência de um caractere em uma string.
fonte
Minha solução com ramda js:
Link para REPL.
fonte
A função usa a string str como parâmetro e conta a ocorrência de cada caractere exclusivo na string. O resultado vem no par de chave-valor para cada caractere.
fonte