[javascript] 자바 스크립트에서 문자열이 목록에 있는지 확인

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에서 수정 ObjectArray프로토 타입을 작성하면 심각한 버그가 발생할 수 있습니다. 자신의 환경에서 안전한지 결정해야합니다. 중요한 것은 배열을 반복하면 (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 방법 ofin, 대신 사용하는 것입니다 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'));

그리고 많은 다른 사람들!