꽤 직설적 인. 자바 스크립트에서 문자열에 배열에 포함 된 하위 문자열이 포함되어 있는지 확인해야합니다.
map
그래서만큼 some
. some
도움이 될 것이지만 함수를 전달해야합니다.
꽤 직설적 인. 자바 스크립트에서 문자열에 배열에 포함 된 하위 문자열이 포함되어 있는지 확인해야합니다.
map
그래서만큼 some
. some
도움이 될 것이지만 함수를 전달해야합니다.
답변:
당신을 위해 그것을 할 내장 기능은 없습니다, 당신은 그것을위한 함수를 작성해야합니다.
당신이 경우 알 문자열이 정규 표현식에서 특별 문자 중 하나를 포함하지 않는, 당신은이 같은 비트를 속일 수 있습니다 :
if (new RegExp(substrings.join("|")).test(string)) {
// At least one match
}
... 당신이 찾고있는 하위 문자열에 대한 일련의 대안 인 정규 표현식을 만들고 (예 one|two
:) 일치하는 항목이 있는지 테스트하지만 하위 문자열 중 하나에 특수 문자가 포함되어 있는지 테스트 정규식 ( *
, [
등)에서는 먼저 탈출해야하며 대신 지루한 루프를 수행하는 것이 좋습니다.
라이브 예 :
이 질문에 대한 의견에서 Martin 은 Array.prototype.map
ECMAScript5 의 새로운 방법에 대해 묻습니다 . map
그다지 도움이되지는 않지만 다음 some
과 같습니다.
if (substrings.some(function(v) { return str.indexOf(v) >= 0; })) {
// There's at least one
}
라이브 예 :
ECMAScript5 호환 구현에서만 사용할 수 있지만 polyfill에는 쉽지 않습니다.
2020 년 업데이트 : some
화살표 기능 (ES2015 +)으로 예제가 더 간단 할 수 있으며 다음 includes
대신에 사용할 수 있습니다 indexOf
.
if (substrings.some(v => str.includes(v))) {
// There's at least one
}
라이브 예 :
bind
나에게 화살표 기능을 훨씬 더 읽을 수 있지만 그것을 던지 십시오.
if (substrings.some(str.includes.bind(str))) {
// There's at least one
}
라이브 예 :
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
내가 경험 한 경우에 어디에,이 내가 조건에 대한 결과를 반환 할 두 가지 경우가 있습니다.
한 줄 솔루션
substringsArray.some(substring=>yourBigString.includes(substring))
true\false
부분 문자열 인 경우 반환exists\does'nt exist
ES6 지원 필요
function containsAny(str, substrings) {
for (var i = 0; i != substrings.length; i++) {
var substring = substrings[i];
if (str.indexOf(substring) != - 1) {
return substring;
}
}
return null;
}
var result = containsAny("defg", ["ab", "cd", "ef"]);
console.log("String was found in substring " + result);
인터넷 검색을하는 사람들에게
확실한 대답이되어야합니다.
const substrings = ['connect', 'ready'];
const str = 'disconnect';
if (substrings.some(v => str === v)) {
// Will only return when the `str` is included in the `substrings`
}
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]
}
}
편집 : 테스트 순서가 중요하지 않으면 루프 변수를 하나만 사용하여 이것을 사용할 수 있습니다.
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
.
배열이 크지 않으면을 사용하여 개별적으로 각 하위 문자열에 대해 문자열을 반복 확인 할 수 있습니다 indexOf()
. 또는 대안으로 하위 문자열을 사용하여 정규 표현식을 작성할 수 있습니다.
검색 문자열 또는 검색 문자열 배열을 사용하여 태그 또는 키워드 배열을 검색하는 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 strings
function contains(a, b) {
// array matches
if (Array.isArray(b)) {
return b.some(x => a.indexOf(x) > -1);
}
// string match
return a.indexOf(b) > -1;
}
사용법 예 :
var a = ["a","b","c","d","e"];
var b = ["a","b"];
if ( contains(a, b) ) {
// 1 or more matches found
}
나는 당신 String
이 프로토 타입을 확장 / 수정하도록 제안하고 있지는 않지만 이것이 내가 한 일입니다.
String.prototype.includes = function (includes) {
console.warn("String.prototype.includes() has been modified.");
return function (searchString, position) {
if (searchString instanceof Array) {
for (var i = 0; i < searchString.length; i++) {
if (includes.call(this, searchString[i], position)) {
return true;
}
}
return false;
} else {
return includes.call(this, searchString, position);
}
}
}(String.prototype.includes);
console.log('"Hello, World!".includes("foo");', "Hello, World!".includes("foo") ); // false
console.log('"Hello, World!".includes(",");', "Hello, World!".includes(",") ); // true
console.log('"Hello, World!".includes(["foo", ","])', "Hello, World!".includes(["foo", ","]) ); // true
console.log('"Hello, World!".includes(["foo", ","], 6)', "Hello, World!".includes(["foo", ","], 6) ); // false
underscore.js 또는 lodash.js를 사용하여 문자열 배열에서 다음을 수행 할 수 있습니다.
var contacts = ['Billy Bob', 'John', 'Bill', 'Sarah'];
var filters = ['Bill', 'Sarah'];
contacts = _.filter(contacts, function(contact) {
return _.every(filters, function(filter) { return (contact.indexOf(filter) === -1); });
});
// ['John']
그리고 단일 문자열에서 :
var contact = 'Billy';
var filters = ['Bill', 'Sarah'];
_.every(filters, function(filter) { return (contact.indexOf(filter) >= 0); });
// true
TJ Crowder의 답변을 바탕으로
이스케이프 된 RegExp를 사용하여 하나 이상의 하위 문자열이 "한 번 이상"발생하는지 테스트합니다.
function buildSearch(substrings) {
return new RegExp(
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>
let obj = [{name : 'amit'},{name : 'arti'},{name : 'sumit'}];
let input = 'it';
필터 사용 :
obj.filter((n)=> n.name.trim().toLowerCase().includes(input.trim().toLowerCase()))
map()
새로운 HTML5-JavaScript 버전 에는 기능이 없습니까? 그 주제에 대해 읽은 것을 기억합니다 ...