Как проверить, является ли строка «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 ]

5 голосов
/ 15 июля 2014

Лучшее решение - перестать использовать библиотечные вызовы и просто признать, что вы работаете с двумя массивами. Ручная реализация является одновременно короткой и более быстрой, чем любое другое решение, которое я видел здесь.

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;
}

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

2 голосов
/ 29 апреля 2014

Я только что узнал об этой библиотеке строк:

http://stringjs.com/

Включите файл js, а затем используйте переменную S, например:

S('hi there').endsWith('hi there')

Его также можно использовать в NodeJS, установив его:

npm install string

Тогда требуется его как переменная S:

var S = require('string');

На веб-странице также есть ссылки на библиотеки альтернативных строк, если эта не нравится.

1 голос
/ 04 мая 2012
var str = 'hol';
var data = 'hola mundo';
if (data.length >= str.length && data.substring(0, str.length) == str)
    return true;
else
    return false;
0 голосов
/ 24 сентября 2014

Основываясь на ответах, приведенных здесь, это версия, которую я сейчас использую, так как она, кажется, дает лучшую производительность на основе тестирования JSPerf (и насколько я могу судить функционально завершена).

if(typeof String.prototype.startsWith != 'function'){
    String.prototype.startsWith = function(str){
        if(str == null) return false;
        var i = str.length;
        if(this.length < i) return false;
        for(--i; (i >= 0) && (this[i] === str[i]); --i) continue;
        return i < 0;
    }
}

Это было основано на startWith2 отсюда: http://jsperf.com/startswith2/6. Я добавил небольшой твик для небольшого улучшения производительности, и с тех пор также добавил проверку на то, что строка сравнения является нулевой или неопределенной, и преобразовал ее, чтобы добавить в Струнный прототип с использованием методики в ответе CMS.

Обратите внимание, что эта реализация не поддерживает параметр "position", который упоминается на этой странице Mozilla Developer Network , но в любом случае он не является частью предложения ECMAScript.

0 голосов
/ 20 июля 2013

Вы также можете вернуть все члены массива, которые начинаются со строки, создав собственный прототип / расширение для прототипа массива, также известного как

Array.prototype.mySearch = function (target) {
    if (typeof String.prototype.startsWith != 'function') {
        String.prototype.startsWith = function (str){
        return this.slice(0, str.length) == str;
      };
    }
    var retValues = [];
    for (var i = 0; i < this.length; i++) {
        if (this[i].startsWith(target)) { retValues.push(this[i]); }
    }
    return retValues;
};

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

var myArray = ['Hello', 'Helium', 'Hideout', 'Hamster'];
var myResult = myArray.mySearch('Hel');
// result -> Hello, Helium
0 голосов
/ 21 октября 2012

Если вы работаете с startsWith() и endsWith(), вы должны быть осторожны с начальными пробелами. Вот полный пример:

var str1 = " Your String Value Here.!! "; // Starts & ends with spaces    
if (str1.startsWith("Your")) { }  // returns FALSE due to the leading spaces…
if (str1.endsWith("Here.!!")) { } // returns FALSE due to trailing spaces…

var str2 = str1.trim(); // Removes all spaces (and other white-space) from start and end of `str1`.
if (str2.startsWith("Your")) { }  // returns TRUE
if (str2.endsWith("Here.!!")) { } // returns TRUE
...