Нет ли map()функции в новой HTML5-JavaScript-версии? Я помню, что читал что-то на эту тему ...
Мартин Хеннингс
@ Мартин: Хороший вопрос, не mapтак много, как some. someпомогло бы, но вы должны были бы передать это функции.
TJ Crowder
Ответы:
224
Там нет ничего встроенного, что сделает это за вас, вам придется написать функцию для этого.
Если вы знаете, что строки не содержат символов, которые являются специальными в регулярных выражениях, то вы можете немного обмануть, например так:
if(newRegExp(substrings.join("|")).test(string)){// At least one match}
... который создает регулярное выражение, представляющее собой серию чередований для подстрок, которые вы ищете (например, one|two), и проверяет, есть ли совпадения для какой-либо из них, но если любая из подстрок содержит какие-либо специальные символы в регулярных выражениях ( *, [и т. д.) вы должны сначала избежать их, и вам лучше просто делать скучный цикл.
var substrings =["one","two","three"];var str;// Setup
console.log("Substrings: "+ substrings.join(","));// Try it where we expect a match
str ="this has one";if(newRegExp(substrings.join("|")).test(str)){
console.log("Match using '"+ str +"'");}else{
console.log("No match using '"+ str +"'");}// Try it where we DON'T expect a match
str ="this doesn't have any";if(newRegExp(substrings.join("|")).test(str)){
console.log("Match using '"+ str +"'");}else{
console.log("No match using '"+ str +"'");}
var substrings =["one","two","three"];var str;// Setup
console.log("Substrings: "+ substrings.join(","));// Try it where we expect a match
str ="this has one";if(substrings.some(function(v){return str.indexOf(v)>=0;})){
console.log("Match using '"+ str +"'");}else{
console.log("No match using '"+ str +"'");}// Try it where we DON'T expect a match
str ="this doesn't have any";if(substrings.some(function(v){return str.indexOf(v)>=0;})){
console.log("Match using '"+ str +"'");}else{
console.log("No match using '"+ str +"'");}
const substrings =["one","two","three"];let str;// Setup
console.log("Substrings: "+ substrings.join(","));// Try it where we expect a match
str ="this has one";if(substrings.some(v => str.includes(v))){
console.log("Match using '"+ str +"'");}else{
console.log("No match using '"+ str +"'");}// Try it where we DON'T expect a match
str ="this doesn't have any";if(substrings.some(v => str.includes(v))){
console.log("Match using '"+ str +"'");}else{
console.log("No match using '"+ str +"'");}
const substrings =["one","two","three"];let str;// Setup
console.log("Substrings: "+ substrings.join(","));// Try it where we expect a match
str ="this has one";if(substrings.some(str.includes.bind(str))){
console.log("Match using '"+ str +"'");}else{
console.log("No match using '"+ str +"'");}// Try it where we DON'T expect a match
str ="this doesn't have any";if(substrings.some(str.includes.bind(str))){
console.log("Match using '"+ str +"'");}else{
console.log("No match using '"+ str +"'");}
Вы можете расширить выше решение, удалив все символы регулярных выражений , кроме «|»: new RegExp(substrings.join("|").replace(/[^\w\s^|]/gi, '')).test(string).
user007
использование indexOf может быть слишком нечетким и давать странный результат. Это может быть просто помещено, чтобы соответствовать строке, используя оператор равенства. например, ('disconnect'.indexOf('connect') >= 0) === trueно('disconnect' === 'conenct') === false
kylewelsby
@halfcube: А? Я не понимаю тебя, я боюсь. Ничто в ответе выше не предполагает, что 'disconnect' === 'connect'это будет что-либо кроме false. Кроме того, indexOfэто не нечетко, это действительно очень четко определено.
TJ Crowder
indexOfбудет соответствовать обоим, disconnectи connectгде в случае, в котором я находился, это два разных случая, для которых я хочу вернуть результаты в условном выражении.
kylewelsby
54
var yourstring ='tasty food';// the string to check againstvar substrings =['foo','bar'],
length = substrings.length;while(length--){if(yourstring.indexOf(substrings[length])!=-1){// one of the substrings is in yourstring}}
Вы, дети ... когда я был ребенком, мы должны были использовать такие вещи, как циклы for, и вы должны были использовать несколько строк и знать, был ли ваш массив на основе 1 или нуля, да ... в половину времени вы получили это неправильно и пришлось отлаживать и высматривать маленького жучка под названием «я».
aamarks
25
function containsAny(str, substrings){for(var i =0; i != substrings.length; i++){var substring = substrings[i];if(str.indexOf(substring)!=-1){return substring;}}returnnull;}var result = containsAny("defg",["ab","cd","ef"]);
console.log("String was found in substring "+ result);
Кроме того, он возвращает первое вхождение слова в строку, что очень полезно. Не только правда / ложь.
Кай Ноак
20
Для людей, гуглящих,
Твердый ответ должен быть.
const substrings =['connect','ready'];const str ='disconnect';if(substrings.some(v => str === v)){// Will only return when the `str` is included in the `substrings`}
или короче: if (substrings.some (v => v === str)) {
kofifus
10
Обратите внимание, что это ответ на немного другой вопрос, который спрашивает, содержит ли строка текст из массива подстрок. Этот код проверяет , является ли строка является одним из подстрок. Зависит от того, что подразумевается под «содержит», я полагаю.
ФКрик
8
var str ="texttexttext";var arr =["asd","ghj","xtte"];for(var i =0, len = arr.length; i < len;++i){if(str.indexOf(arr[i])!=-1){// str contains arr[i]}}
edit: если порядок тестов не имеет значения, вы можете использовать это (только с одной переменной цикла):
var str ="texttexttext";var arr =["asd","ghj","xtte"];for(var i = arr.length -1; i >=0;--i){if(str.indexOf(arr[i])!=-1){// str contains arr[i]}}
Ваш первый пример не нуждается в lenпеременной, просто проверьте i < arr.length.
GreySage
3
Если массив не большой, вы можете просто зациклить и проверить строку для каждой подстроки в отдельности, используя indexOf(). В качестве альтернативы вы можете создать регулярное выражение с подстрокой в качестве альтернативы, что может быть или не быть более эффективным.
Допустим, у нас есть список из 100 подстрок. Какой способ будет более эффективным: RegExp или цикл?
Диёрбек Садуллаев
3
Функция Javascript для поиска в массиве тегов или ключевых слов, используя строку поиска или массив строк поиска. (Использует ES5 некоторый метод массива и функции стрелок ES6 )
// returns true for 1 or more matches, where 'a' is an array and 'b' is a search string or an array of multiple search stringsfunction contains(a, b){// array matchesif(Array.isArray(b)){return b.some(x => a.indexOf(x)>-1);}// string matchreturn a.indexOf(b)>-1;}
Пример использования:
var a =["a","b","c","d","e"];var b =["a","b"];if( contains(a, b)){// 1 or more matches found}
var specsFilter =[.....];var yourString ="......";//if found a matchif(specsFilter.some((element)=>{returnnewRegExp(element,"ig").test(yourString)})){// do something}
Это супер поздно, но я только столкнулся с этой проблемой. В моем собственном проекте я использовал следующее, чтобы проверить, была ли строка в массиве:
использование экранированного RegExp для проверки на наличие «хотя бы одного» хотя бы одной из подстрок.
function buildSearch(substrings){returnnewRegExp(
substrings
.map(function(s){return s.replace(/[.*+?^${}()|[\]\\]/g,'\\$&');}).join('{1,}|')+'{1,}');}var pattern = buildSearch(['hello','world']);
console.log(pattern.test('hello there'));
console.log(pattern.test('what a wonderful world'));
console.log(pattern.test('my name is ...'));
Если вы работаете с длинным списком подстрок, состоящих из полных «слов», разделенных пробелами, или любого другого общего символа, вы можете быть немного хитрыми в своем поиске.
Сначала разделите вашу строку на группы по X, затем X + 1, затем X + 2, ..., до Y. X и Y должны быть числом слов в вашей подстроке с наименьшим и большинством слов соответственно. Например, если X равен 1, а Y равен 4, «Альфа-бета-гамма-дельта» становится:
"Альфа" "Бета" "Гамма" "Дельта"
"Альфа Бета" "Бета Гамма" "Гамма Дельта"
"Альфа Бета Гамма" "Бета Гамма Дельта"
"Альфа Бета Гамма Дельта"
Если X будет 2 и Y будет 3, то вы пропустите первый и последний ряд.
Теперь вы можете быстро выполнить поиск в этом списке, если вставите его в набор (или карту), намного быстрее, чем при сравнении строк.
Недостатком является то, что вы не можете искать подстроки, такие как "Ta Gamm". Конечно, вы можете учесть это, разделяя по символам, а не по словам, но тогда вам часто придется создавать массивный сет, и затраченное на это время / память перевешивает преимущества.
<!DOCTYPE html><html><head><script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script><script>
$(document).ready(function(){var list =["bad","words","include"]var sentence = $("#comments_text").val()
$.each(list,function( index, value ){if(sentence.indexOf(value)>-1){
console.log(value)}});});</script></head><body><input id="comments_text" value="This is a bad, with include test"></body></html>
map()
функции в новой HTML5-JavaScript-версии? Я помню, что читал что-то на эту тему ...map
так много, какsome
.some
помогло бы, но вы должны были бы передать это функции.Ответы:
Там нет ничего встроенного, что сделает это за вас, вам придется написать функцию для этого.
Если вы знаете, что строки не содержат символов, которые являются специальными в регулярных выражениях, то вы можете немного обмануть, например так:
... который создает регулярное выражение, представляющее собой серию чередований для подстрок, которые вы ищете (например,
one|two
), и проверяет, есть ли совпадения для какой-либо из них, но если любая из подстрок содержит какие-либо специальные символы в регулярных выражениях (*
,[
и т. д.) вы должны сначала избежать их, и вам лучше просто делать скучный цикл.Живой пример:
Показать фрагмент кода
В комментарии к этому вопросу Мартин спрашивает о новом
Array.prototype.map
методе в ECMAScript5.map
не так уж много помочь, ноsome
это:Живой пример:
Показать фрагмент кода
У вас есть только в ECMAScript5-совместимых реализациях, хотя это тривиально для polyfill.
Обновление в 2020 году :
some
пример может быть проще с функцией стрелки (ES2015 +), и вы можете использоватьincludes
вместоindexOf
:Живой пример:
Показать фрагмент кода
Или даже бросить
bind
на это, хотя для меня функция стрелки гораздо более читабельна:Живой пример:
Показать фрагмент кода
источник
new RegExp(substrings.join("|").replace(/[^\w\s^|]/gi, '')).test(string)
.('disconnect'.indexOf('connect') >= 0) === true
но('disconnect' === 'conenct') === false
'disconnect' === 'connect'
это будет что-либо кромеfalse
. Кроме того,indexOf
это не нечетко, это действительно очень четко определено.indexOf
будет соответствовать обоим,disconnect
иconnect
где в случае, в котором я находился, это два разных случая, для которых я хочу вернуть результаты в условном выражении.источник
Одноканальное решение
Возвращает,
true\false
если подстрокаexists\does'nt exist
Требуется поддержка ES6
источник
источник
Для людей, гуглящих,
Твердый ответ должен быть.
источник
edit: если порядок тестов не имеет значения, вы можете использовать это (только с одной переменной цикла):
источник
len
переменной, просто проверьтеi < arr.length
.Если массив не большой, вы можете просто зациклить и проверить строку для каждой подстроки в отдельности, используя
indexOf()
. В качестве альтернативы вы можете создать регулярное выражение с подстрокой в качестве альтернативы, что может быть или не быть более эффективным.источник
Функция Javascript для поиска в массиве тегов или ключевых слов, используя строку поиска или массив строк поиска. (Использует ES5 некоторый метод массива и функции стрелок ES6 )
Пример использования:
источник
Не то чтобы я предлагал вам пойти и расширить / модифицировать
String
прототип, но это то, что я сделал:String.prototype.includes ()
источник
На основе решения TJ Crowder я создал прототип для решения этой проблемы:
источник
Для полной поддержки;)
источник
Лучший ответ здесь: это также без учета регистра
источник
Используя underscore.js или lodash.js, вы можете сделать следующее для массива строк:
И на одной строке:
источник
Это супер поздно, но я только столкнулся с этой проблемой. В моем собственном проекте я использовал следующее, чтобы проверить, была ли строка в массиве:
Таким образом, вы можете взять предопределенный массив и проверить, содержит ли он строку:
источник
опираясь на ответ TJ Crowder
использование экранированного RegExp для проверки на наличие «хотя бы одного» хотя бы одной из подстрок.
источник
Если вы работаете с длинным списком подстрок, состоящих из полных «слов», разделенных пробелами, или любого другого общего символа, вы можете быть немного хитрыми в своем поиске.
Сначала разделите вашу строку на группы по X, затем X + 1, затем X + 2, ..., до Y. X и Y должны быть числом слов в вашей подстроке с наименьшим и большинством слов соответственно. Например, если X равен 1, а Y равен 4, «Альфа-бета-гамма-дельта» становится:
"Альфа" "Бета" "Гамма" "Дельта"
"Альфа Бета" "Бета Гамма" "Гамма Дельта"
"Альфа Бета Гамма" "Бета Гамма Дельта"
"Альфа Бета Гамма Дельта"
Если X будет 2 и Y будет 3, то вы пропустите первый и последний ряд.
Теперь вы можете быстро выполнить поиск в этом списке, если вставите его в набор (или карту), намного быстрее, чем при сравнении строк.
Недостатком является то, что вы не можете искать подстроки, такие как "Ta Gamm". Конечно, вы можете учесть это, разделяя по символам, а не по словам, но тогда вам часто придется создавать массивный сет, и затраченное на это время / память перевешивает преимущества.
источник
Для полной поддержки (дополнительно к версиям @ricca ).
источник
Вы можете проверить так:
источник
Использовать фильтр:
источник