SQL에서 문자열이 다음과 같은 목록에 있는지 확인할 수 있습니다.
Column IN ('a', 'b', 'c')
JavaScript로 이것을 수행하는 좋은 방법은 무엇입니까? 이 작업을 수행하는 것은 매우 어리 석습니다.
if (expression1 || expression2 || str === 'a' || str === 'b' || str === 'c') {
// do something
}
그리고 나는 이것의 성능이나 선명도에 대해 확신하지 못한다.
if (expression1 || expression2 || {a:1, b:1, c:1}[str]) {
// do something
}
또는 스위치 기능을 사용할 수 있습니다.
var str = 'a',
flag = false;
switch (str) {
case 'a':
case 'b':
case 'c':
flag = true;
default:
}
if (expression1 || expression2 || flag) {
// do something
}
그러나 그것은 끔찍한 혼란입니다. 어떤 아이디어?
이 경우 회사 인트라넷 페이지와 마찬가지로 Internet Explorer 7을 사용해야합니다. 그래서 ['a', 'b', 'c'].indexOf(str) !== -1
어떤 구문 설탕없이 기본적으로 작동하지 않습니다.
답변
당신은 전화 할 수 있습니다 indexOf
:
if (['a', 'b', 'c'].indexOf(str) >= 0) {
//do something
}
답변
EcmaScript 6
ES6을 사용하는 경우 항목의 배열을 구성하고 다음을 사용할 수 있습니다 includes
.
['a', 'b', 'c'].includes('b')
이 이상의 몇 가지 고유의 장점이 indexOf
제대로의 존재를 테스트 할 수 있기 때문에 NaN
목록을, 등의 중간 하나없는 배열 요소와 일치 수 [1, , 2]
에를 undefined
. 와 같은 JavaScript 형식의 배열includes
에서도 작동합니다 .Uint8Array
브라우저 지원 (IE 또는 Edge 등)에 대해 우려가있는 경우 CanIUse.Com 에서 확인할Array.includes
수 있으며 누락 된 브라우저 또는 브라우저 버전을 대상으로하려면 polyfilling 에 polyfill.io를 사용하는 includes
것이 좋습니다 .
배열없이
isInList
다음과 같이 문자열에 새 속성을 추가 할 수 있습니다 .
if (!String.prototype.isInList) {
String.prototype.isInList = function() {
let value = this.valueOf();
for (let i = 0, l = arguments.length; i < l; i += 1) {
if (arguments[i] === value) return true;
}
return false;
}
}
그런 다음 다음과 같이 사용하십시오.
'fox'.isInList('weasel', 'fox', 'stoat') // true
'fox'.isInList('weasel', 'stoat') // false
에 대해 동일한 작업을 수행 할 수 있습니다 Number.prototype
.
Array.indexOf
최신 브라우저를 사용하는 경우 indexOf
항상 작동합니다. 그러나 IE8 및 이전 버전의 경우 폴리 필이 필요합니다.
경우 indexOf
-1을 반환 항목은 목록에 없습니다. 그러나이 메소드는 제대로 검사하지 않으며 NaN
명시적인 값과 일치 undefined
할 수 있지만 누락 된 요소 undefined
는 배열에서 와 일치 할 수 없습니다 [1, , 2]
.
IE 용 폴리 필 indexOf
또는 includes
지원되지 않는 기타 브라우저 / 버전
위에서 언급 한 polyfill.io 와 같은 서비스를 사용하지 않으려는 경우 언제든지 자체 소스 코드 표준 호환 사용자 정의 폴리 필을 포함 할 수 있습니다. 예를 들어, Mozilla Developer Network에는에 대한 것이 indexOf
있습니다.
Internet Explorer 7 용 솔루션을 만들어야하는이 상황에서 indexOf()
표준과 호환되지 않는 더 간단한 버전의 기능을 “내 자신의 롤”으로 만들었습니다 .
if (!Array.prototype.indexOf) {
Array.prototype.indexOf = function(item) {
var i = this.length;
while (i--) {
if (this[i] === item) return i;
}
return -1;
}
}
그러나 Array.prototype
장기적으로 수정 이 최선의 대답 이라고 생각하지 않습니다 . JavaScript에서 수정 Object
및 Array
프로토 타입을 작성하면 심각한 버그가 발생할 수 있습니다. 자신의 환경에서 안전한지 결정해야합니다. 중요한 것은 배열을 반복하면 (Array.prototype이 속성을 추가 한 경우) for ... in
새 함수 이름을 키 중 하나로 반환한다는 것입니다.
Array.prototype.blah = function() { console.log('blah'); };
let arr = [1, 2, 3];
for (let x in arr) { console.log(x); }
// Result:
0
1
2
blah // Extra member iterated over!
코드가 지금 작동 할 수도 있지만 미래의 누군가가 상속 된 키를 열심히 보호하지 않는 타사 JavaScript 라이브러리 또는 플러그인을 추가하는 순간 모든 것이 깨질 수 있습니다.
그 파손을 방지하는 기존 방법은 객체가 실제로 상속과 재산으로 보유하고 있는지 확인하기 위해 각 값을 확인하려면 열거하는 동안이며, if (arr.hasOwnProperty(x))
그리고 오직 다음 그와 함께 작업 x
.
이 추가 키 문제를 피하는 새로운 ES6 방법 of
은 in
, 대신 사용하는 것입니다 for (let x of arr)
. 그러나 모든 코드 및 타사 라이브러리 가이 방법을 엄격하게 준수한다고 보장 할 수 없다면이 질문의 목적을 위해 includes
위에서 언급 한대로 사용하고 싶을 것입니다 .
답변
답변의 대부분은 제안 Array.prototype.indexOf
방법은, 유일한 문제는 그것이 작동하지 것입니다 어떤 IE9 이전 IE 버전.
대안으로 모든 브라우저에서 작동하는 두 가지 옵션을 더 남겨 둡니다.
if (/Foo|Bar|Baz/.test(str)) {
// ...
}
if (str.match("Foo|Bar|Baz")) {
// ...
}
답변
배열에는 indexOf
문자열을 검색하는 데 사용할 수 있는 방법이 있습니다.
js> a = ['foo', 'bar', 'baz']
foo,bar,baz
js> a.indexOf('bar')
1
js> a.indexOf('quux')
-1
답변
내가 사용한 트릭은
>>> ("something" in {"a string":"", "somthing":"", "another string":""})
false
>>> ("something" in {"a string":"", "something":"", "another string":""})
true
당신은 같은 것을 할 수 있습니다
>>> a = ["a string", "something", "another string"];
>>> b = {};
>>> for(var i=0; i<a.length;i++){b[a[i]]="";} /* Transform the array in a dict */
>>> ("something" in b)
true
답변
내 꺼야 :
String.prototype.inList=function(list){
return (Array.apply(null, arguments).indexOf(this.toString()) != -1)
}
var x = 'abc';
if (x.inList('aaa','bbb','abc'))
console.log('yes');
else
console.log('no');
배열을 전달해도 괜찮다면 더 빠릅니다.
String.prototype.inList=function(list){
return (list.indexOf(this.toString()) != -1)
}
var x = 'abc';
if (x.inList(['aaa','bbb','abc']))
console.log('yes')
jsperf는 다음과 같습니다. http://jsperf.com/bmcgin-inlsit
답변
RegExp
보편적이지만 배열로 작업하고 있음을 이해합니다. 따라서이 접근법을 확인하십시오. 나는 그것을 사용하는 데 사용하며 매우 효과적이며 타오르는 것입니다!
var str = 'some string with a';
var list = ['a', 'b', 'c'];
var rx = new RegExp(list.join('|'));
rx.test(str);
다음과 같은 몇 가지 수정 사항을 적용 할 수도 있습니다.
짧막 한 농담
new RegExp(list.join('|')).test(str);
대소 문자 구분
var rx = new RegExp(list.join('|').concat('/i'));