Как проверить, является ли строка «StartsWith» другой строкой? - PullRequest
1616 голосов
/ 14 марта 2009

Как бы я написал эквивалент C # String.StartsWith в JavaScript?

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

haystack.startsWith(needle) == true

Примечание. Это старый вопрос, и, как указано в комментариях, ECMAScript 2015 (ES6) ввел метод .startsWith. Однако на момент написания этого обновления (2015 г.) поддержка браузера далека от завершения .

Ответы [ 16 ]

1718 голосов
/ 14 марта 2009

Вы можете использовать метод ECMAScript 6 String.prototype.startsWith(), но он еще не поддерживается во всех браузерах . Вы захотите использовать shim / polyfill, чтобы добавить его в браузеры, которые его не поддерживают. Создание реализации, которая соответствует всем деталям, изложенным в спецификации , немного сложнее. Если вам нужна верная прокладка, используйте:

После того, как вы изменили метод (или если вы поддерживаете только браузеры и механизмы JavaScript, у которых он уже есть), вы можете использовать его следующим образом:

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

var haystack = "Hello world";
var prefix = 'orl';
haystack.startsWith(prefix); // false
1257 голосов
/ 02 января 2011

Другая альтернатива с .lastIndexOf:

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

Это смотрит назад через haystack для случая needle, начиная с индекса 0 haystack Другими словами, он только проверяет, начинается ли haystack с needle.

В принципе, это должно иметь преимущества в производительности по сравнению с некоторыми другими подходами:

  • Он не ищет весь haystack.
  • Он не создает новую временную строку, а затем немедленно удаляет ее.
585 голосов
/ 14 марта 2009
data.substring(0, input.length) === input
182 голосов
/ 04 января 2011

Без вспомогательной функции, просто с помощью метода регулярных выражений .test:

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

Чтобы сделать это с динамической строкой, а не жестко закодированной (при условии, что строка не будет содержать управляющих символов регулярного выражения):

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

Вы должны проверить Есть ли в Javascript функция RegExp.escape? , если существует вероятность появления в строке управляющих символов регулярного выражения.

55 голосов
/ 27 апреля 2016

Лучшее решение:

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

А вот заканчивается , если вам это тоже нужно:

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

Для тех, кто предпочитает создавать прототип в 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;
});

Использование:

"abc".startsWith("ab")
true
"c".ensdWith("c") 
true
52 голосов
/ 12 февраля 2016

Я просто хотел добавить свое мнение по этому поводу.

Я думаю, мы можем просто использовать вот так:

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

if (haystack.indexOf(needle) == 0) {
  // Code if string starts with this substring
}
38 голосов
/ 27 мая 2009

Вот небольшое улучшение решения 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

Проверка, существует ли функция в случае, если будущий браузер реализует ее в собственном коде или если она будет реализована другой библиотекой. Например, библиотека прототипов уже реализует эту функцию.

Использование ! немного быстрее и лаконичнее, чем === 0, но не так читабельно.

21 голосов
/ 31 мая 2011

Также проверьте underscore.string.js . Он поставляется с набором полезных методов тестирования и манипуляции со строками, включая метод startsWith. Из документов:

начинается с _.startsWith(string, starts)

Этот метод проверяет, начинается ли string с starts.

_("image.gif").startsWith("image")
=> true
15 голосов
/ 17 мая 2014

Я недавно задал себе тот же вопрос.
Есть несколько возможных решений, вот 3 допустимых:

  • s.indexOf(starter) === 0
  • s.substr(0,starter.length) === starter
  • s.lastIndexOf(starter, 0) === 0 (добавлено после просмотра ответа Марка Байерса )
  • с использованием цикла:

    function startsWith(s,starter) {
      for (var i = 0,cur_c; i < starter.length; i++) {
        cur_c = starter[i];
        if (s[i] !== starter[i]) {
          return false;
        }
      }
      return true;
    }
    

Я не сталкивался с последним решением, которое использует цикл.
Удивительно, но это решение значительно превосходит первые три.
Вот тест jsperf, который я выполнил, чтобы прийти к такому выводу: http://jsperf.com/startswith2/2

Мир

ps: ecmascript 6 (гармония) представляет собственный метод startsWith для строк.
Подумайте, сколько времени было бы сэкономлено, если бы они подумали о включении столь необходимого метода в самой первоначальной версии.

Обновление

Как указал Стив (первый комментарий к этому ответу), вышеуказанная пользовательская функция выдаст ошибку, если данный префикс короче всей строки. Он исправил это и добавил оптимизацию цикла, которую можно посмотреть на http://jsperf.com/startswith2/4.

Обратите внимание, что есть 2 цикла оптимизации, которые включил Стив, первый из двух показал лучшую производительность, поэтому я выложу этот код ниже:

function startsWith2(str, prefix) {
  if (str.length < prefix.length)
    return false;
  for (var i = prefix.length - 1; (i >= 0) && (str[i] === prefix[i]); --i)
    continue;
  return i < 0;
}
11 голосов
/ 05 января 2016

Поскольку это настолько популярно, я думаю, что стоит отметить, что в ECMA 6 есть реализация этого метода, и при подготовке к нему следует использовать «официальный» полифилл, чтобы предотвратить будущие проблемы и разрывы.

К счастью, специалисты Mozilla предоставляют нам один:

https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith

if (!String.prototype.startsWith) {
    String.prototype.startsWith = function(searchString, position) {
        position = position || 0;
        return this.indexOf(searchString, position) === position;
    };
}

Пожалуйста, обратите внимание, что это имеет то преимущество, что изящно игнорируется при переходе на ECMA 6.

...