Question Comment vérifier si une chaîne "StartsWith" une autre chaîne?


Comment pourrais-je écrire l'équivalent de C # String.StartsWith en JavaScript?

var haystack = 'hello world';
var needle = 'he';

//haystack.startsWith(needle) == true

Note: Ceci est une vieille question, et comme indiqué dans les commentaires ECMAScript 2015 (ES6) a introduit le .startsWith méthode. Cependant, au moment d'écrire cette mise à jour (2015) le support du navigateur est loin d'être complet.


1547
2018-03-14 20:12


origine


Réponses:


Vous pouvez utiliser ECMAScript 6 String.prototype.startsWith() méthode, mais c'est pas encore supporté dans tous les navigateurs. Vous voudrez utiliser un shim / polyfill pour l'ajouter sur les navigateurs qui ne le supportent pas. Créer une implémentation conforme à tous les détails exposés dans la spécification est un peu compliqué, et la version définie dans cette réponse ne le fera pas; si vous voulez une cale fidèle, utilisez soit:

Une fois que vous avez calé la méthode (ou si vous ne supportez que les navigateurs et les moteurs JavaScript qui l'ont déjà), vous pouvez l'utiliser comme ceci:

"Hello World!".startsWith("He"); // true

var haystack = "Hello world";
var prefix = 'orl';
haystack.startsWith(prefix); // false

1655
2018-03-14 20:19



Une autre alternative avec .lastIndexOf:

haystack.lastIndexOf(needle, 0) === 0

Cela regarde en arrière à travers haystack pour une occurrence de needle à partir de l'index 0 de haystack. En d'autres termes, il vérifie seulement si haystack commence avec needle.

En principe, cela devrait avoir des avantages de performance par rapport à d'autres approches:

  • Il ne cherche pas tout le monde haystack.
  • Il ne crée pas une nouvelle chaîne temporaire et la supprime immédiatement.

1226
2018-01-02 16:14



data.substring(0, input.length) === input

569
2018-03-14 20:14



Sans une fonction d'aide, juste en utilisant regex .test méthode:

/^He/.test('Hello world')

Pour ce faire, utilisez une chaîne dynamique plutôt qu'une chaîne codée en dur (en supposant que la chaîne ne contienne aucun caractère de contrôle regexp):

new RegExp('^' + needle).test(haystack)

Vous devriez vérifier Existe-t-il une fonction RegExp.escape en Javascript? si la possibilité existe que les caractères de contrôle regexp apparaissent dans la chaîne.


180
2018-01-04 00:59



Je voulais juste ajouter mon opinion à ce sujet.

Je pense que nous pouvons juste utiliser comme ceci:

var haystack = 'hello world';
var needle = 'he';

if (haystack.indexOf(needle) == 0) {
  // Code if string starts with this substring
}

50
2018-02-12 14:47



Meilleure solution:

function startsWith(str, word) {
    return str.lastIndexOf(word, 0) === 0;
}

startsWith("aaa", "a")
true
startsWith("aaa", "ab")
false
startsWith("abc", "abc")
true
startsWith("abc", "c")
false
startsWith("abc", "a")
true
startsWith("abc", "ba")
false
startsWith("abc", "ab")
true

Et voici se termine par si vous en avez aussi besoin:

function endsWith(str, word) {
    return str.indexOf(word, str.length - word.length) !== -1;
}

Pour ceux qui préfèrent le prototyper en String: 

String.prototype.startsWith || (String.prototype.startsWith = function(word) {
    return this.lastIndexOf(word, 0) === 0;
});

String.prototype.endsWith   || (String.prototype.endsWith = function(word) {
    return this.indexOf(word, this.length - word.length) !== -1;
});

Usage: 

"abc".startsWith("ab")
true
"c".ensdWith("c") 
true

42
2018-04-26 21:56



Voici une amélioration mineure de la solution de CMS:

if(!String.prototype.startsWith){
    String.prototype.startsWith = function (str) {
        return !this.indexOf(str);
    }
}

"Hello World!".startsWith("He"); // true

 var data = "Hello world";
 var input = 'He';
 data.startsWith(input); // true

Vérifier si la fonction existe déjà au cas où un futur navigateur l'implémenterait en code natif ou s'il était implémenté par une autre bibliothèque. Par exemple, la bibliothèque de prototypes implémente déjà cette fonction.

En utilisant ! est légèrement plus rapide et plus concis que === 0 mais pas aussi lisible.


37
2018-05-27 02:54