Как бы я написал эквивалент C # String.StartsWith
в JavaScript?
var haystack = 'hello world';
var needle = 'he';
haystack.startsWith(needle) == true
Примечание. Это старый вопрос, и, как указано в комментариях, ECMAScript 2015 (ES6) представил этот .startsWith
метод. Однако на момент написания этого обновления (2015) поддержка браузера еще далека от завершения .
источник
Еще одна альтернатива с
.lastIndexOf
:Это смотрит назад через
haystack
для возникновения ,needle
начиная с индекса0
вhaystack
. Другими словами, он только проверяет,haystack
начинается ли сneedle
.В принципе, это должно иметь преимущества в производительности по сравнению с некоторыми другими подходами:
haystack
.источник
"aba".lastIndexOf ("a")
2, как вы"aba".lastIndexOf ("a", 0)
источник
.lastIndexOf(input, 0)
сравнивает первые N символов, тогда как.substring(0, input.length) === input
считает N, подстрокует данные с длиной N, а затем сравнивает эти N символов. Если нет оптимизации кода, эта вторая версия не может быть быстрее, чем другая. Не поймите меня неправильно, я никогда не найду ничего лучше, чем вы предлагаете. :)lastIndexOf
начинается с индекса 0, а не с конца. Это поначалу меня тоже сбило с толку. Тем не менее, проверка того, с чего начинается строка, является настолько распространенной задачей, что JavaScript действительно должен иметь соответствующий API, а не все идиомы и альтернативы, которые вы видите на этой странице, какими бы умными они ни были.Без вспомогательной функции, просто с помощью
.test
метода регулярных выражений :Чтобы сделать это с динамической строкой, а не жестко закодированной (при условии, что строка не будет содержать никаких управляющих символов регулярного выражения):
Вы должны проверить Есть ли функция RegExp.escape в Javascript? если существует возможность, что управляющие символы регулярного выражения появляются в строке.
источник
/^he/i
Лучшее решение:
И вот что заканчивается, если вам это тоже нужно:
Для тех, кто предпочитает создавать прототип в String:
Применение:
С методом:
источник
Я просто хотел добавить свое мнение по этому поводу.
Я думаю, что мы можем просто использовать так:
источник
indexOf
что перестанет искать всю строку, когда она найдет первый случай. Я проверил это.Вот небольшое улучшение решения CMS:
Проверка, существует ли функция в случае, если будущий браузер реализует ее в собственном коде или если она будет реализована другой библиотекой. Например, библиотека прототипов уже реализует эту функцию.
Использование
!
немного быстрее и лаконичнее, чем=== 0
при чтении.источник
String.prototype
плохой идее, потому что это не подходит близко к соответствию спецификации дляString.prototype.startsWith
. Любой код, который пытается использовать метод ES6, может потерпеть неудачу, если вы делаете это; он может хорошо посмотреть, если метод уже определен, увидеть, что он (плохо) вами, и не добавить совместимую со спецификацией прокладку, что впоследствии приведет к некорректному поведению.Также проверьте underscore.string.js . Он поставляется с кучей полезных методов тестирования и манипуляции со строками, включая
startsWith
метод. Из документов:источник
_.string.startsWith
Я недавно задал себе тот же вопрос.
Есть несколько возможных решений, вот 3 из них:
s.indexOf(starter) === 0
s.substr(0,starter.length) === starter
s.lastIndexOf(starter, 0) === 0
(добавлено после просмотра ответа Марка Байерса )используя цикл:
Я не сталкивался с последним решением, которое использует цикл.
Удивительно, но это решение значительно превосходит первые 3.
Вот тест jsperf, который я выполнил, чтобы прийти к такому выводу: http://jsperf.com/startswith2/2
мир
PS: ecmascript 6 (гармония) представляет нативный
startsWith
метод для строк.Подумайте, сколько времени было бы сэкономлено, если бы они решили включить этот столь необходимый метод в саму первоначальную версию.
Обновить
Как указал Стив (первый комментарий к этому ответу), вышеуказанная пользовательская функция выдаст ошибку, если данный префикс короче всей строки. Он исправил это и добавил оптимизацию цикла, которую можно посмотреть по адресу http://jsperf.com/startswith2/4 .
Обратите внимание, что есть 2 цикла оптимизации, которые включил Стив, первый из двух показал лучшую производительность, поэтому я опубликую этот код ниже:
источник
Поскольку это настолько популярно, я думаю, что стоит отметить, что в ECMA 6 есть реализация этого метода, и при подготовке к этому следует использовать «официальный» полифилл, чтобы предотвратить будущие проблемы и разрывы.
К счастью, специалисты Mozilla предоставляют нам один:
https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith
Пожалуйста, обратите внимание, что это имеет то преимущество, что изящно игнорируется при переходе на ECMA 6.
источник
Лучшее решение - перестать использовать библиотечные вызовы и просто признать, что вы работаете с двумя массивами. Ручная реализация является как короткой, так и более быстрой, чем любое другое решение, которое я видел здесь.
Для сравнения производительности (успех и неудача), см. Http://jsperf.com/startswith2/4 . (Убедитесь, что вы проверите более поздние версии, которые могли превзойти мою.)
источник
Я только что узнал об этой библиотеке строк:
http://stringjs.com/
Включите файл js, а затем используйте
S
переменную следующим образом:Его также можно использовать в NodeJS, установив его:
Затем требуя его в качестве
S
переменной:На веб-странице также есть ссылки на библиотеки альтернативных строк, если вам не по вкусу.
источник
Мне в основном нужен был быстрый способ определить, находится ли длинная игла в длинном стоге сена, и они очень похожи, за исключением последних символов.
Вот код, который я написал, который для каждой функции (сращивания, подстроки, startWith и т. Д.) Проверяет оба значения, когда они возвращают значение false и true для строки haystack (
nestedString
) из 1.000.0001 символов и ложной или истинной строки иглы 1.000.000 символы (testParentStringFalse
иtestParentStringTrue
, соответственно):Я провел этот тест на Chrome 75 , Firefox 67 , Safari 12 и Opera 62 .
Я не включил Edge и IE, потому что у меня их нет на этой машине, но если кто-то из вас захочет запустить скрипт для Edge и хотя бы IE 9 и поделиться выводом здесь, мне было бы очень любопытно увидеть результаты.
Просто помните, что вам нужно воссоздать 3 длинные строки и сохранить скрипт в файле, который вы затем откроете в браузере, поскольку копирование / вставка на консоли браузера заблокирует его, поскольку длина каждой строки> = 1.000.000).
Вот результаты:
Хром 75 (
substring
побед):Firefox 67 (
indexOf
побед):Safari 12 (
slice
побеждает за ложные результаты,startsWith
побеждает за истинные результаты, также Safari является самым быстрым с точки зрения общего времени для выполнения всего теста):Opera 62 (
substring
выигрывает. Результаты похожи на Chrome, и я не удивлен, поскольку Opera основана на Chromium и Blink):Оказывается, у каждого браузера есть свои особенности реализации (кроме Opera, основанной на Chrome Chromium и Blink).
Конечно, можно и нужно проводить дальнейшее тестирование с различными вариантами использования (например, когда игла действительно короткая по сравнению со стогом сена, когда стог сена короче иглы и т. Д.), Но в моем случае мне нужно было сравнить очень длинные струны и хотел бы поделиться этим здесь.
источник
источник
Основываясь на ответах здесь, это версия, которую я сейчас использую, поскольку она, кажется, дает лучшую производительность, основанную на тестировании JSPerf (и насколько я могу судить, функционально завершена).
Это было основано на StartWith2 отсюда: http://jsperf.com/startswith2/6 . Я добавил небольшой твик для незначительного улучшения производительности, а также добавил проверку на то, что строка сравнения имеет значение null или undefined, и преобразовал ее для добавления в прототип String, используя технику ответа CMS.
Обратите внимание, что эта реализация не поддерживает параметр «position», который упоминается на этой странице в сети разработчиков Mozilla , но в любом случае он не является частью предложения ECMAScript.
источник
Я не уверен, для JavaScript, но в машинописи я сделал что-то вроде
Я думаю, это должно работать на JS тоже. Я надеюсь, что это помогает!
источник
Если вы работаете с,
startsWith()
аendsWith()
затем вы должны быть осторожны с ведущими пробелами. Вот полный пример:источник
startsWith()
иendsWith()
функции. Ничего больше!Вы также можете вернуть все члены массива, которые начинаются со строки, создав собственный прототип / расширение для прототипа массива, иначе
И использовать это:
источник