Як праверыць, ці ўтрымоўвае радок падрадок у JavaScript?
Звычайна я чакаў бы String.contains()
, але, падобна, яго няма.
Які разумны спосаб праверыць гэта?
- 1
- 2
Вось спіс бягучых магчымасцяў:
1. (ES6) includes
- перайдзіце да адказу
var string = "foo", substring = "oo"; string.includes(substring);
2. ES5 і старэй indexOf
var string = "foo", substring = "oo"; string.indexOf(substring) !== -1;
String.prototype.indexOf
вяртае пазіцыю радкі ў іншы радку. Калі не знойдзены, ён верне -1
.
3. search
- перайдзіце да адказу
var string = "foo", expr = /oo/; string.search(expr);
4. lodash ўключае - перайдзіце да адказу
var string = "foo", substring = "oo"; _.includes(string, substring);
5. RegExp - перайдзіце да адказу
var string = "foo", expr = /oo/; // no quotes here expr.test(string);
6. Матч - пайсці, каб адказаць
var string = "foo", expr = /oo/; string.match(expr);
Тэсты прадукцыйнасці паказваюць, што indexOf
можа быць лепшым выбарам, калі справа даходзіць да таго, што хуткасць мае значэнне.
Вы можаце лёгка дадаць метад contains
да String з дапамогай гэтага аператара:
String.prototype.contains = function(it) { return this.indexOf(it) != -1; };
Заўвага: гл. Каментары ніжэй для дапушчальнага аргументу для таго, каб не выкарыстоўваць гэта. Мая парада: выкарыстоўвайце сваё ўласнае меркаванне.

У якасці альтэрнатывы:
if (typeof String.prototype.contains === 'undefined') { String.prototype.contains = function(it) { return this.indexOf(it) != -1; }; }
Праблема з вашым кодам заключаецца ў тым, што JavaScript адчувальны да рэгістра. выклік метаду
indexof()
павінен быць
indexof()
Паспрабуйце яго выправіць і паглядзіце, ці дапамагае гэта:
if (test.indexOf("title") !=-1) { alert(elm); foundLinks++; }
"potato".includes("to"); > true
Звярніце ўвагу, што вам можа спатрэбіцца загрузіць es6-shim
ці аналагічны, каб гэта працавала ў старых браўзэрах.
require('es6-shim')
var index = haystack.indexOf(needle);
Вы можаце выкарыстоўваць метад JavaScript search()
.
Сінтаксіс: string.search(regexp)
Вяртае пазіцыю супадзення або -1, калі супадзенне не знойдзена.
См. Прыклады: jsref_search
Вам не патрэбен складаны сінтаксіс рэгулярных выразаў. Калі вы не знаёмыя з імі, гэта зробіць просты st.search("title")
. Калі вы хочаце, каб ваш тэст быў неадчувальным да рэгістра, вы павінны зрабіць st.search(/title/i)
.
String.prototype.includes()
быў уведзены ў ES6.
Вызначае, ці можа адзін радок быць знойдзена ў іншы радку, вяртаючы true або false адпаведна.
сінтаксіс
var contained = str.includes(searchString [, position]);
параметры
searchString
Радок, якую трэба шукаць унутры гэтага радка.
position
Пазіцыя ў гэтым радку, у якой трэба пачынаць пошук searchString
па змаўчанні 0.
прыклад
167
Калі вы шукалі альтэрнатыву для напісання чэк-выродлівага -1, замест гэтага вы дадаеце ~ Тыльда.
if (~haystack.indexOf('needle')) alert('found');
Джо Цімермана - вы ўбачыце, што выкарыстанне ~ on -1 пераўтворыць яго ў 0. Лік 0 з'яўляецца значэнне false, што азначае, што ён будзе вылічвацца як false пры пераўтварэнні ў булева. Спачатку гэта можа здацца не вельмі моцным, але памятайце, што функцыі, такія як indexOf, вяртаюць -1, калі запыт не знойдзены. Гэта азначае, што замест таго, каб пісаць нешта падобнае на гэта:
if (someStr.indexOf("a") >= 0) { // Found it } else { // Not Found }
Цяпер у вас можа быць менш знакаў у кодзе, каб вы маглі пісаць напрыклад:
if (~someStr.indexOf("a")) { // Found it } else { // Not Found }
Больш падрабязна падрабязней тут
Гэтая частка кода павінна добра працаваць:
var str="This is testing for javascript search !!!"; if(str.search("for") != -1) { //logic }
Агульны спосаб запісу метаду contains
у JavaScript :
if (!String.prototype.contains) { String.prototype.contains = function (arg) { return !!~this.indexOf(arg); }; }
Аператар пабітавае адмаўлення ( ~
) выкарыстоўваецца, каб ператварыць -1
ў 0
(falsey), а ўсе астатнія значэння будуць выдатнымі ад нуля (праўда).
Аператары з падвойным булева адмаўленнем выкарыстоўваюцца для перакладу лікі ў лагічны.
У ES5
76
Замест выкарыстання фрагментаў кода, знойдзеных тут і там у Інтэрнэце, вы таксама можаце выкарыстоўваць добра пратэставаны і задакументаваць бібліятэку. Два варыянты, якія я б рэкамендаваў:
1-й варыянт: Выкарыстоўвайце Lodash : у яго ёсць includes
:
_.includes('foobar', 'ob'); // → true
Lodash - самая папулярная залежнасць бібліятэкі javascript для npm і мае мноства карысных метадаў ўтыліты javascript. Так што для многіх праектаў вы ўсё роўна захочаце гэтага; -)
Другая опцыя: Ці выкарыстоўвайце Underscore.string : у яе ёсць include
метад:
_.str.include('foobar', 'ob'); // → true
Вось апісанне Underscore.string, яно проста дадае 9kb, але дае вам усе перавагі, якія добра пратэставаны і дакументаваная бібліятэка мае над фрагментамі кода copy'n'paste:
Underscore.string - гэта бібліятэка JavaScript для зручнай маніпуляцыі з радкамі, пашырэнне для Underscore.js, натхнёнае Prototype.js, Right.js, Падкрэсліванне і прыгожы мова Ruby.
Underscore.string дае вам некалькі карысных функцый: capize, чысты, ўключае, count, escapeHTML, unescapeHTML, ўстаўку, зрошчванне, startsWith, endsWith, загалоўкі, абрэзка, абразанне і г.д.
Звярніце ўвагу, што на Underscore.string ўплывае Underscore.js , але можа выкарыстоўвацца без яго.
Апошняе не найменшую: З версіяй JavaScript ES6 пастаўляецца убудаваны метад includes
:
'foobar'.includes('ob'); // → true
Большасць сучасных браўзэраў ўжо падтрымліваюць яго, звярніце ўвагу на табліцу сумяшчальнасці ES6 .
Вы можаце выкарыстоўваць селектар jQuery :contains
.
$("div:contains('John')")
Адзначце тут: contains-selector
Выкарыстоўвайце рэгулярны выраз:
Гэта проста спрацавала для мяне. Ён выбірае радкі, якія не ўтрымліваюць тэрмін "Выдалена:"
if (eventString.indexOf("Deleted:") == -1)
Іншы спосаб зрабіць гэта:
Вы можаце выкарыстоўваць функцыю адпаведнасці, то ёсць нешта накшталт:
x = "teststring"; if (x.match("test")) { // Code }
match () таксама можа працаваць з рэгулярным выразам:
x = "teststring"; if (x.match(/test/i)) { // Code }
Вы шукалі .indexOf
MDN .
indexOf
будзе вяртаць індэкс падрадковых падрадка. Індэкс будзе карэляваць з тым, дзе пачынаецца падрадок. Калі супадзення няма, вяртаецца -1. Вось простая дэманстрацыя гэтай канцэпцыі:
49
Вам трэба выклікаць indexOf з капіталам "O", як паказана. Варта таксама адзначыць, што ў класе JavaScript зарэзерваваныя слова, вы павінны выкарыстоўваць className для атрымання гэтага атрыбуту дадзеных. Прычына, па якой ён, верагодна, трывае няўдачу, заключаецца ў тым, што ён вяртае нулявое значэнне. Вы можаце зрабіць наступнае, каб атрымаць значэнне вашага класа ...
var test = elm.getAttribute("className"); //or var test = elm.className
Паколькі пытанне даволі папулярны, я падумаў, што магу дадаць у код трохі сучасны водар.
// const : creates an immutable constant const allLinks = document.getElementsByTagName("a"); // [].reduce.call : gives access to the reduce method on a HTMLCollection // () => {} : ES6 arrow function const foundLinks = [].reduce.call(allLinks, (sum, link) => { // bitwise OR : converts the boolean value to a number return sum + (link.classList.contains("title") | 0); }, 0); // template literal console.log('Found ${foundLinks || "no"} title class');
HTMLCollection// const : creates an immutable constant const allLinks = document.getElementsByTagName("a"); // [].reduce.call : gives access to the reduce method on a HTMLCollection // () => {} : ES6 arrow function const foundLinks = [].reduce.call(allLinks, (sum, link) => { // bitwise OR : converts the boolean value to a number return sum + (link.classList.contains("title") | 0); }, 0); // template literal console.log('Found ${foundLinks || "no"} title class');
BTW, правільным адказам з'яўляецца няправільны indexOf
або нестандартныя String.contains
. Загрузка знешняй бібліятэкі (асабліва калі код напісаны ў чыстым JavaScript) або важдацца з String.prototype
або з выкарыстаннем назваў паведамленняў трохі перабраў.
Існуе гладкі і лепшы спосаб зрабіць гэта, і ён выкарыстоўвае аператар (BitWise NOT).
if(~"John".indexOf("J")) { alert("Found") } else { alert("Not Found"); }
Пабітавае не пераўтварае "x" ў - (x + 1), таму, калі x атрымліваецца -1 з метаду indexOf, то ён будзе ператвораны ў - (-1 + 1) = -0, што з'яўляецца ілжывым значэнне.
String.prototype.indexOf()
або String.prototype.search()
?!
Як ужо згадвалася, радкі JavaScript маюць як indexOf
, так і search
.
Ключавое адрозненне паміж імі складаецца ў тым, што indexOf
выкарыстоўваецца толькі для простых падрадкоў, тады як search
таксама падтрымлівае рэгулярныя выразы. Вядома, перавага выкарыстання indexOf
заключаецца ў тым, што ён хутчэй.
Гл. Таксама У JavaScript, у чым розніца паміж indexOf () і search ()? .
Ўкараненне ўласнай метаду String.prototype.contains()
Калі вы хочаце дадаць свой уласны метад contains
да кожнай радку, лепшым спосабам зрабіць гэта будзе @zzzzBov :
if (!String.prototype.contains) { String.prototype.contains = function (arg) { return !!~this.indexOf(arg); }; }
Вы б выкарыстоўвалі яго наступным чынам:
'Hello World'.contains('orl');
Рэалізацыя карыстацкай ўтыліты
Звычайна не рэкамендуецца дадаваць ўласныя метады да стандартных аб'ектаў у JavaScript, напрыклад, таму што гэта можа парушыць сумяшчальнасць.
Калі вам сапраўды патрэбен уласны метад contains
і / або іншыя наладжвальныя радковыя метады, лепш стварыць сваю ўласную бібліятэку ўтыліты і дадаць у гэтую бібліятэку свае ўласныя радковыя метады:
var helper = {}; helper.string = { contains : function (haystack, needle) { return !!~haystack.indexOf(needle); }, ... };
Вы б выкарыстоўвалі яго наступным чынам:
helper.string.contains('Hello World', 'orl');
Выкарыстанне іншай бібліятэкі ўтыліты
Калі вы не хочаце ствараць сваю ўласную дапаможную бібліятэку, ёсць, вядома, заўсёды магчымасць выкарыстоўваць іншую бібліятэку ўтыліты. Як згадвалася @nachtigall , найбольш папулярнымі з'яўляюцца Lodash і Underscore.js .
У Lodash вы можаце выкарыстоўваць _.includes()
, які вы выкарыстоўваеце наступным чынам:
_.includes('Hello World', 'orl');
У Underscore.js вы можаце выкарыстоўваць _.str.include()
, які вы выкарыстоўваеце наступным чынам:
_.str.include('Hello World', 'orl');
Найпростае абыходнае рашэнне
if (!String.prototype.contains) { String.prototype.contains= function() { return String.prototype.indexOf.apply(this, arguments) !== -1; }; }
вы можаце выкарыстоўваць наступным чынам
"hello".contains("he") // true "hello world".contains("lo w")//true "hello world".contains("lo wa")//false "hello world".contains(" ")//true "hello world".contains(" ")//false
ES6 ўтрымлівае String.prototype.includes
.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes
прыклад
var a = "Test String"; if(a.search("ring")!=-1){ //exist } else { //not found }
JavaScript-код для выкарыстання метаду contains
ў масіве:
<html> <head> <h2>Use of contains() method</h2> <script> Array.prototype.contains = function (element) { for (var i = 0; i < this.length; i++) { if (this[i] == element) { return true; } } return false; } arr1 = ["Rose", "India", "Technologies"]; document.write("The condition is "+arr1.contains("India")+"<br>"); </script> </head> <b>[If the specified element is present in the array, it returns true otherwise returns false.]</b> </html>
array<html> <head> <h2>Use of contains() method</h2> <script> Array.prototype.contains = function (element) { for (var i = 0; i < this.length; i++) { if (this[i] == element) { return true; } } return false; } arr1 = ["Rose", "India", "Technologies"]; document.write("The condition is "+arr1.contains("India")+"<br>"); </script> </head> <b>[If the specified element is present in the array, it returns true otherwise returns false.]</b> </html>
У дадзеным кодзе метад contains
вызначае, ці прысутнічае ўказаны элемент у масіве ці не. Калі правераны элемент прысутнічае ў масіве, ён вяртае true, інакш ён вяртае false.
Каб сабраць нейкія дапушчальныя рашэнні:
19
Бо ёсць скарга на выкарыстанне прататыпа, і паколькі выкарыстанне indexOf
робіць ваш код менш чытаным і паколькі regexp перапоўнены:
function stringContains(inputString, stringToFind) { return (inputString.indexOf(stringToFind) != -1); }
Гэта кампраміс, у які я трапіў.
JavaScript
var str = "My big string contain apples and oranges"; var n = str.indexOf("apples"); alert(n); //will alert 22, -1 if not found
JQuery
<p>My big string contain apples and oranges</p> alert($("p:contains(apples)")[0] != undefined); //will alert true if found
Выкарыстоўвайце убудаваную і найпростую радок IE match()
у радку. Каб дасягнуць таго, што вы чакаеце, зрабіце наступнае:
var stringData ="anyString Data"; var subStringToSearch = "any"; // This will give back the substring if matches and if not returns null var doesContains = stringData.match(subStringToSearch); if(doesContains !=null) { alert("Contains Substring"); }
and if not returns nullvar stringData ="anyString Data"; var subStringToSearch = "any"; // This will give back the substring if matches and if not returns null var doesContains = stringData.match(subStringToSearch); if(doesContains !=null) { alert("Contains Substring"); }
Самы просты спосаб - выкарыстоўваць indexOf. Каб проста праверыць радок string
для падрадка substr
, вы можаце выкарыстоўваць гэты метад:
string = "asdf"; substr = "as"; alert(string.indexOf(substr) == -1 ? false : true);
Як вам патрэбна функцыя string.contains()
, вы можаце рэалізаваць яе самастойна наступным чынам:
String.prototype.contains = function(test) { return this.indexOf(test) == -1 ? false : true; };
Цяпер вы можаце выкарыстоўваць гэты метад ecen shorter, каб праверыць, ці ўтрымоўвае радок спецыяльную падрадок:
string = "asdf"; alert(string.contains("as"));
Вось JSFiddle .
- 1
- 2
Іншыя пытанні па пазнаках JavaScript String substring contains String-matching або Задайце пытанне