IT story

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

hot-time 2020. 4. 20. 20:30
반응형

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


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

배열없이

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].

indexOfInternet Explorer 8 및 이전 버전 또는이 버전이없는 다른 브라우저의 폴리 필

항상 표준 호환 사용자 정의 폴리 필 을 사용하여 이전 브라우저에서이 작업을 수행 할 수 있습니다.

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'));


그리고 많은 다른 사람들!


in_array 함수를 사용해야 할 것 같습니다.

jQuery-> inArray

프로토 타입-> Array.indexOf

또는 jQuery 또는 프로토 타입을 사용하지 않는 경우 다음 예제를 참조하십시오.

양식 참고 사항 : 이것으로 명명 된 변수는 이름에 포함 된 이름 (명사)에 대해 알려주도록 명명되어야합니다.


indexOf프로토 타입의 Enumerable.include () 를 사용하면 ( 다른 포스터가 제안한 것 외에도 ) 더 깔끔하고 간결하게 만들 수 있습니다.

var list = ['a', 'b', 'c'];
if (list.include(str)) {
  // do stuff
}

질문과 Array.indexOf 메서드를 사용하는 솔루션에 감사드립니다.

이 솔루션의 코드를 사용하여 IMO로 작성을보다 간단하고 명확하게하는 inList () 함수를 만들었습니다.

function inList(psString, psList) 
{
    var laList = psList.split(',');

    var i = laList.length;
    while (i--) {
        if (laList[i] === psString) return true;
    }
    return false;
}

용법:

if (inList('Houston', 'LA,New York,Houston') {
  // THEN do something when your string is in the list
}

indexOf 사용 (IE8에서는 작동하지 않습니다).

if (['apple', 'cherry', 'orange', 'banana'].indexOf(value) >= 0) {
    // found
}

IE8을 지원하기 위해 Mozilla의 indexOf를 구현할 수 있습니다.

if (!Array.prototype.indexOf) {
    // indexOf polyfill code here
}

String.prototype.match (docs)를 통한 정규 표현식

if (fruit.match(/^(banana|lemon|mango|pineapple)$/)) {

}

문자열과 목록을 취하는 간단한 함수를 언급 한 사람이 아무도 없습니다.

function in_list(needle, hay)
{
    var i, len;

    for (i = 0, len = hay.length; i < len; i++)
    {
        if (hay[i] == needle) { return true; }
    }

    return false;
}

var alist = ["test"];

console.log(in_list("test", alist));

내 솔루션은 다음과 같은 구문을 만듭니다.

// Checking to see if var 'column' is in array ['a', 'b', 'c']

if (column.isAmong(['a', 'b', 'c']) {
  // Do something
}

그리고 기본 Object 프로토 타입을 다음과 같이 확장하여 구현합니다.

Object.prototype.isAmong = function (MyArray){
   for (var a=0; a<MyArray.length; a++) {
      if (this === MyArray[a]) { 
          return true;
      }
   }
   return false;
}

대안으로 메소드 이름을 isInArray (아마도 inArray는 아님) 또는 간단히 isIn으로 지정할 수 있습니다.

장점 : 간단하고 간단하며 자체 문서화.


SLaks의 답변 의 단순화 된 버전 도 작동합니다.

if ('abcdefghij'.indexOf(str) >= 0) {
    // Do something
}

.... 문자열은 배열 자체이기 때문에. :)

필요한 경우 앞에서 설명한대로 Internet Explorer 용 indexof 함수를 구현하십시오.

참고 URL : https://stackoverflow.com/questions/2430000/determine-if-string-is-in-list-in-javascript

반응형