Comment pourrais-je écrire l'équivalent de C # String.StartsWith
en JavaScript?
var haystack = 'hello world';
var needle = 'he';
haystack.startsWith(needle) == true
Remarque: Il s'agit d'une vieille question et, comme indiqué dans les commentaires, ECMAScript 2015 (ES6) a introduit la .startsWith
méthode. Cependant, au moment de la rédaction de cette mise à jour (2015), la prise en charge du navigateur est loin d'être complète .
la source
Une autre alternative avec
.lastIndexOf
:Cela regarde en arrière à travers
haystack
pour une occurrence deneedle
partir de l'index0
dehaystack
. En d'autres termes, il vérifie uniquement sihaystack
commence parneedle
.En principe, cela devrait présenter des avantages en termes de performances par rapport à d'autres approches:
haystack
.la source
"aba".lastIndexOf ("a")
est 2 comme vous le signalez , mais"aba".lastIndexOf ("a", 0)
est 0, ce qui est correctla source
.lastIndexOf(input, 0)
compare les N premiers caractères, tandis que le.substring(0, input.length) === input
nombre N, sous-chaîne les données à N longueur, puis compare ces N caractères. À moins d'une optimisation du code, cette deuxième version ne peut pas être plus rapide que l'autre. Ne vous méprenez pas cependant, je ne trouverais jamais par moi-même quelque chose de mieux que ce que vous avez suggéré. :)lastIndexOf
commencé à l'index 0, pas à la fin. Cela m'a aussi fait trébucher au début. Pourtant, vérifier avec quoi commence une chaîne est une tâche si courante que JavaScript devrait vraiment avoir une API appropriée, pas tous les idiomes et alternatives que vous voyez sur cette page, aussi intelligents soient-ils.Sans fonction d'assistance, il suffit d'utiliser la
.test
méthode de regex :Pour ce faire avec une chaîne dynamique plutôt qu'une chaîne codée en dur (en supposant que la chaîne ne contiendra aucun caractère de contrôle regexp):
Vous devriez vérifier Y a-t-il une fonction RegExp.escape en Javascript? si la possibilité existe que des caractères de contrôle d'expression rationnelle apparaissent dans la chaîne.
la source
/^he/i
Meilleure solution:
Et voici la fin Avec si vous en avez besoin aussi:
Pour ceux qui préfèrent le prototyper en String:
Usage:
Avec méthode:
la source
Je voulais juste ajouter mon opinion à ce sujet.
Je pense que nous pouvons simplement utiliser comme ceci:
la source
indexOf
, arrêtera de rechercher la chaîne entière quand il trouvera la première occurrence. Je l'ai vérifié.Voici une amélioration mineure à la solution de CMS:
Vérifier si la fonction existe déjà dans le cas où un futur navigateur l'implémenterait en code natif ou si elle est implémentée par une autre bibliothèque. Par exemple, la bibliothèque de prototypes implémente déjà cette fonction.
L'utilisation
!
est légèrement plus rapide et plus concise que=== 0
si elle n'est pas aussi lisible.la source
String.prototype
est une mauvaise idée car il ne se rapproche pas du respect des spécifications pourString.prototype.startsWith
. Tout code qui essaie d'utiliser la méthode ES6 est susceptible d'échouer si vous faites cela; il peut bien chercher à voir si la méthode est déjà définie, voir qu'elle l'est (mal, par vous) et ne pas ajouter de shim conforme aux spécifications, conduisant à un comportement incorrect plus tard.Consultez également underscore.string.js . Il est livré avec un tas de méthodes de test et de manipulation de chaînes utiles, dont une
startsWith
méthode. De la documentation:la source
_.string.startsWith
Je me suis récemment posé la même question.
Il existe plusieurs solutions possibles, en voici 3 valides:
s.indexOf(starter) === 0
s.substr(0,starter.length) === starter
s.lastIndexOf(starter, 0) === 0
(ajouté après avoir vu la réponse de Mark Byers )en utilisant une boucle:
Je n'ai pas trouvé la dernière solution qui utilise une boucle.
Étonnamment, cette solution surpasse les 3 premiers d'une marge significative.
Voici le test jsperf que j'ai effectué pour arriver à cette conclusion: http://jsperf.com/startswith2/2
Paix
ps: ecmascript 6 (harmonie) introduit une
startsWith
méthode native pour les chaînes.Imaginez combien de temps aurait été gagné s'ils avaient pensé à inclure cette méthode si nécessaire dans la version initiale elle-même.
Mise à jour
Comme Steve l'a souligné (le premier commentaire sur cette réponse), la fonction personnalisée ci-dessus générera une erreur si le préfixe donné est plus court que la chaîne entière. Il a corrigé cela et ajouté une optimisation de boucle qui peut être consultée sur http://jsperf.com/startswith2/4 .
Notez qu'il y a 2 optimisations de boucle que Steve a incluses, la première des deux a montré de meilleures performances, donc je posterai ce code ci-dessous:
la source
Étant donné que cela est si populaire, je pense qu'il convient de souligner qu'il existe une implémentation de cette méthode dans ECMA 6 et qu'en préparation, il convient d'utiliser le polyfill `` officiel '' afin d'éviter de futurs problèmes et larmes.
Heureusement, les experts de Mozilla nous en fournissent un:
https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith
Veuillez noter que cela a l'avantage d'être ignoré avec élégance lors de la transition vers ECMA 6.
la source
La solution la plus performante consiste à cesser d'utiliser les appels de bibliothèque et à reconnaître simplement que vous travaillez avec deux tableaux. Une implémentation roulée à la main est à la fois courte et aussi plus rapide que toutes les autres solutions que j'ai vues ici.
Pour des comparaisons de performances (succès et échec), voir http://jsperf.com/startswith2/4 . (Assurez-vous de vérifier les versions ultérieures qui peuvent avoir trompé la mienne.)
la source
Je viens d'apprendre cette bibliothèque de chaînes:
http://stringjs.com/
Incluez le fichier js, puis utilisez la
S
variable comme ceci:Il peut également être utilisé dans NodeJS en l'installant:
Le nécessitant ensuite comme
S
variable:La page Web contient également des liens vers d'autres bibliothèques de chaînes, si celle-ci ne vous convient pas.
la source
J'avais essentiellement besoin d'un moyen rapide pour savoir si une longue aiguille se trouve dans une longue botte de foin et elles sont très similaires, sauf pour les derniers caractères.
Voici le code que j'ai écrit qui pour chaque fonction (épissure, sous-chaîne, démarre avec, etc.) teste à la fois quand ils retournent faux et vrai contre une chaîne de botte de foin (
nestedString
) de 1.000.0001 caractères et une chaîne d'aiguille fausse ou véridique de 1.000.000 caractères (testParentStringFalse
ettestParentStringTrue
, respectivement):J'ai exécuté ce test de référence sur Chrome 75 , Firefox 67 , Safari 12 et Opera 62 .
Je n'ai pas inclus Edge et IE car je ne les ai pas sur cette machine, mais si quelqu'un d'entre vous veut exécuter le script contre Edge et au moins IE 9 et partager la sortie ici, je serais très curieux de voir les résultats.
N'oubliez pas que vous devez recréer les 3 longues chaînes et enregistrer le script dans un fichier que vous ouvrez ensuite dans votre navigateur car le copier / coller sur la console du navigateur le bloquera car la longueur de chaque chaîne est> = 1.000.000).
Voici les sorties:
Chrome 75 (
substring
gagne):Firefox 67 (
indexOf
gagne):Safari 12 (
slice
gagne pour de faux résultats,startsWith
gagne pour de vrais résultats, Safari est également le plus rapide en termes de temps total pour exécuter l'ensemble du test):Opera 62 (
substring
victoires. Les résultats sont similaires à Chrome et je ne suis pas surpris car Opera est basé sur Chrome et Blink):Il s'avère que chaque navigateur a ses propres détails d'implémentation (à l'exception d'Opera, qui est basé sur Chrome et Blink de Chrome).
Bien sûr, un test supplémentaire avec différents cas d'utilisation pourrait et devrait être effectué (par exemple, lorsque l'aiguille est vraiment courte par rapport à la botte de foin, lorsque la botte de foin est plus courte que l'aiguille, etc.), mais dans mon cas, je devais comparer de très longues cordes et voulait le partager ici.
la source
la source
Sur la base des réponses ici, c'est la version que j'utilise maintenant, car elle semble donner les meilleures performances basées sur les tests JSPerf (et est fonctionnellement complète pour autant que je sache).
Ceci était basé sur startsWith2 à partir d'ici: http://jsperf.com/startswith2/6 . J'ai ajouté un petit ajustement pour une amélioration minime des performances, et depuis j'ai également ajouté une vérification pour que la chaîne de comparaison soit nulle ou non définie, et je l'ai convertie pour l'ajouter au prototype String en utilisant la technique dans la réponse de CMS.
Notez que cette implémentation ne prend pas en charge le paramètre "position" qui est mentionné dans cette page Mozilla Developer Network , mais qui ne semble pas faire partie de la proposition ECMAScript de toute façon.
la source
Je ne suis pas sûr pour javascript mais en tapuscrit j'ai fait quelque chose comme
Je suppose que cela devrait aussi fonctionner sur js. J'espère que ça aide!
la source
Si vous travaillez avec
startsWith()
etendsWith()
alors vous devez faire attention aux espaces de tête. Voici un exemple complet:la source
startsWith()
et desendsWith()
fonctions. Rien d'autre!Vous pouvez également renvoyer tous les membres d'un tableau commençant par une chaîne en créant votre propre prototype / extension au prototype du tableau, alias
Et pour l'utiliser:
la source