Como eu escreveria o equivalente a c # String.StartsWith
em JavaScript?
var haystack = 'hello world';
var needle = 'he';
haystack.startsWith(needle) == true
Nota: Essa é uma pergunta antiga e, como apontado nos comentários, o ECMAScript 2015 (ES6) introduziu o .startsWith
método. No entanto, no momento da redação desta atualização (2015), o suporte ao navegador está longe de estar completo .
fonte
Outra alternativa com
.lastIndexOf
:Isso procura
haystack
uma ocorrência deneedle
partida a partir do índice0
dehaystack
. Em outras palavras, ele apenas verifica sehaystack
começa comneedle
.Em princípio, isso deve ter vantagens de desempenho em relação a outras abordagens:
haystack
.fonte
"aba".lastIndexOf ("a")
é 2 como você aponta, mas"aba".lastIndexOf ("a", 0)
é 0, o que está corretofonte
.lastIndexOf(input, 0)
compara os primeiros N caracteres, enquanto.substring(0, input.length) === input
conta N, substrings os dados com comprimento N e, em seguida, compara esses N caracteres. A menos que haja otimização de código, esta segunda versão não pode ser mais rápida que a outra. Não me interpretem mal, eu nunca encontraria algo melhor do que você sugeriu. :)lastIndexOf
começou no índice 0, não no fim. Isso me fez tropeçar também, inicialmente. Ainda assim, verificar com o que uma string começa é uma tarefa tão comum que o JavaScript realmente deve ter uma API adequada para ela, nem todos os idiomas e alternativas que você vê nesta página, por mais inteligentes que sejam.Sem uma função auxiliar, apenas usando o
.test
método regex :Para fazer isso com uma sequência dinâmica, em vez de codificada (assumindo que a sequência não contenha caracteres de controle regexp):
Você deve verificar Existe uma função RegExp.escape em Javascript? se existir a possibilidade de os caracteres de controle regexp aparecerem na string.
fonte
/^he/i
Melhor solução:
E aqui está o endsWith, se você precisar disso também:
Para aqueles que preferem prototipá-lo em String:
Uso:
Com método:
fonte
Eu só queria adicionar minha opinião sobre isso.
Eu acho que podemos usar assim:
fonte
indexOf
parará de procurar toda a string quando encontrar a primeira ocorrência. Eu verifiquei.Aqui está uma pequena melhoria na solução do CMS:
Verificando se a função já existe, caso um navegador futuro a implemente em código nativo ou se ela é implementada por outra biblioteca. Por exemplo, a Prototype Library já implementa essa função.
O uso
!
é um pouco mais rápido e conciso do=== 0
que não é tão legível.fonte
String.prototype
é uma má idéia, porque não chegam nem perto de cumprir a especificação paraString.prototype.startsWith
. Qualquer código que tentar usar o método ES6 poderá falhar se você estiver fazendo isso; pode muito bem verificar se o método já está definido, se é (mal, por você) e não adicionar um calço compatível com as especificações, levando a um comportamento incorreto posteriormente.Verifique também underscore.string.js . Ele vem com vários métodos úteis de teste e manipulação de strings, incluindo um
startsWith
método. Dos documentos:fonte
_.string.startsWith
Recentemente, me fiz a mesma pergunta.
Existem várias soluções possíveis, aqui estão três válidas:
s.indexOf(starter) === 0
s.substr(0,starter.length) === starter
s.lastIndexOf(starter, 0) === 0
(adicionado depois de ver a resposta de Mark Byers )usando um loop:
Não encontrei a última solução que faz uso de um loop.
Surpreendentemente, esta solução supera os 3 primeiros por uma margem significativa.
Aqui está o teste jsperf que realizei para chegar a esta conclusão: http://jsperf.com/startswith2/2
Paz
ps: ecmascript 6 (harmonia) introduz um
startsWith
método nativo para strings.Imagine quanto tempo teria sido economizado se eles tivessem pensado em incluir esse método tão necessário na própria versão inicial.
Atualizar
Como Steve apontou (o primeiro comentário sobre esta resposta), a função personalizada acima gerará um erro se o prefixo fornecido for menor que a string inteira. Ele corrigiu isso e adicionou uma otimização de loop que pode ser visualizada em http://jsperf.com/startswith2/4 .
Observe que existem 2 otimizações de loop que Steve incluiu, a primeira das duas apresentou melhor desempenho, portanto postarei esse código abaixo:
fonte
Como isso é tão popular, acho que vale a pena ressaltar que existe uma implementação para esse método no ECMA 6 e, em preparação para isso, deve-se usar o polyfill 'oficial' para evitar futuros problemas e lágrimas.
Felizmente, os especialistas da Mozilla nos fornecem um:
https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith
Observe que isso tem a vantagem de ser ignorado normalmente na transição para o ECMA 6.
fonte
A melhor solução de desempenho é parar de usar chamadas de biblioteca e apenas reconhecer que você está trabalhando com duas matrizes. Uma implementação manual é curta e também mais rápida do que qualquer outra solução que eu já vi aqui.
Para comparações de desempenho (êxito e falha), consulte http://jsperf.com/startswith2/4 . (Verifique se há versões posteriores que podem ter superado as minhas.)
fonte
Acabei de aprender sobre esta biblioteca de strings:
http://stringjs.com/
Inclua o arquivo js e use a
S
variável assim:Também pode ser usado no NodeJS instalando-o:
Em seguida, exigindo-o como a
S
variável:A página da web também possui links para bibliotecas de cadeias de caracteres alternativas, se esta não lhe agradar.
fonte
Basicamente, eu precisava de uma maneira rápida de descobrir se uma agulha longa está dentro de um palheiro longo e elas são muito semelhantes, exceto os últimos caracteres.
Aqui está o código que escrevi que para cada função (emenda, substring, inicia com, etc.) testa quando retorna falso e verdadeiro em uma cadeia de feno (
nestedString
) de 1.000.0001 caracteres e uma cadeia de agulha falsa ou truculenta de 1.000.000 caracteres (testParentStringFalse
etestParentStringTrue
, respectivamente):Fiz esse teste de benchmark no Chrome 75 , Firefox 67 , Safari 12 e Opera 62 .
Não incluí o Edge e o IE porque não os tenho nesta máquina, mas se alguém quiser executar o script no Edge e pelo menos no IE 9 e compartilhar a saída aqui, ficaria muito curioso para ver os resultados.
Lembre-se de que você precisa recriar as três seqüências longas e salvar o script em um arquivo que você abre no navegador, pois copiar / colar no console do navegador a bloqueia, pois o comprimento de cada sequência é> = 1.000.000).
Aqui estão as saídas:
Chrome 75 (
substring
vitórias):Firefox 67 (
indexOf
vitórias):Safari 12 (
slice
vitórias por resultados falsos,startsWith
vitórias por resultados verdadeiros, também o Safari é o mais rápido em termos de tempo total para executar todo o teste):Opera 62 (
substring
vitórias. Os resultados são semelhantes ao Chrome e não estou surpreso, pois o Opera é baseado em Chromium e Blink):Acontece que todo navegador tem seus próprios detalhes de implementação (além do Opera, que é baseado no Chromium e Blink do Chrome).
Obviamente, testes adicionais com diferentes casos de uso podem e devem ser realizados (por exemplo, quando a agulha é realmente curta comparada ao palheiro, quando o palheiro é mais curto que a agulha, etc ...), mas no meu caso eu precisava comparar cordas muito longas e queria compartilhá-lo aqui.
fonte
fonte
Com base nas respostas aqui, esta é a versão que estou usando agora, pois parece oferecer o melhor desempenho com base no teste JSPerf (e é funcionalmente completo, tanto quanto eu sei).
Isso foi baseado no beginWith2 a partir daqui: http://jsperf.com/startswith2/6 . Eu adicionei um pequeno ajuste para uma pequena melhoria no desempenho e, desde então, também adicionei uma verificação para a seqüência de comparação ser nula ou indefinida, e a converti para adicionar ao protótipo de String usando a técnica na resposta do CMS.
Observe que esta implementação não suporta o parâmetro "position" mencionado nesta página da Mozilla Developer Network , mas que, de qualquer maneira, não parece fazer parte da proposta do ECMAScript.
fonte
Eu não tenho certeza para javascript, mas no texto datilografado eu fiz algo como
Eu acho que deve funcionar em js também. Espero que ajude!
fonte
Se você está trabalhando
startsWith()
eendsWith()
precisa ter cuidado com os espaços à frente. Aqui está um exemplo completo:fonte
startsWith()
eendsWith()
funções. Nada mais!Você também pode retornar todos os membros de uma matriz que começam com uma cadeia de caracteres, criando seu próprio protótipo / extensão para o protótipo da matriz, também conhecido como
E para usá-lo:
fonte