[javascript] 값 목록과 비교하여 변수 평등 확인

변수를 확인하고 있습니다. foo 의 개수가 같은지 있습니다. 예를 들어

if( foo == 1 || foo == 3 || foo == 12 ) {
    // ...
}

요점은 그러한 사소한 작업을위한 코드가 다소 많다는 것입니다. 나는 다음을 생각해 냈다.

if( foo in {1: 1, 3: 1, 12: 1} ) {
    // ...
}

그러나 객체의 항목에 중복 값을 제공해야하기 때문에 이것은 나에게 완전히 호소력이 없습니다.

누구나 여러 값에 대해 평등 검사를 수행하는 적절한 방법을 알고 있습니까?



답변

배열을 사용할 수 있습니다 indexOf:

if ([1,3,12].indexOf(foo) > -1)


답변

ECMA2016에서는 포함 방법을 사용할 수 있습니다 . 내가 본 가장 깨끗한 방법입니다. (IE를 제외한 모든 주요 브라우저에서 지원 (폴리 필은 링크에 있습니다)

if([1,3,12].includes(foo)) {
    // ...
}


답변

제공된 답변을 사용하여 다음과 같이 끝났습니다.

Object.prototype.in = function() {
    for(var i=0; i<arguments.length; i++)
       if(arguments[i] == this) return true;
    return false;
}

다음과 같이 호출 할 수 있습니다.

if(foo.in(1, 3, 12)) {
    // ...
}

편집 : 최근 에이 ‘트릭’을 보았습니다. 값이 문자열이고 특수 문자가 포함되어 있지 않은 경우 유용합니다. 특수 문자의 경우 이스케이프로 인해 추악 해지고 그로 인해 오류가 발생하기 쉽습니다.

/foo|bar|something/.test(str);

더 정확하게 말하면 정확한 문자열을 확인하지만 간단한 동등성 테스트에서는 더 복잡합니다.

/^(foo|bar|something)$/.test(str);


답변

당신은 쓸 수 있습니다 if(foo in L(10,20,30))당신이 정의하는 경우 L

var L = function()
{
    var obj = {};
    for(var i=0; i<arguments.length; i++)
        obj[arguments[i]] = null;

    return obj;
};


답변

이것은 쉽게 확장 가능하고 읽을 수 있습니다.

switch (foo) {
    case 1:
    case 3:
    case 12:
        // ...
        break

    case 4:
    case 5:
    case 6:
        // something else
        break
}

그러나 반드시 쉬운 것은 아닙니다 🙂


답변

var a = [1,2,3];

if ( a.indexOf( 1 ) !== -1 ) { }

indexOf는 핵심 ECMAScript에 없습니다. IE 및 가능하면 Array.prototype.indexOf를 지원하지 않는 다른 브라우저에 대한 스 니펫이 필요합니다.

if (!Array.prototype.indexOf)
{
  Array.prototype.indexOf = function(searchElement /*, fromIndex */)
  {
    "use strict";

    if (this === void 0 || this === null)
      throw new TypeError();

    var t = Object(this);
    var len = t.length >>> 0;
    if (len === 0)
      return -1;

    var n = 0;
    if (arguments.length > 0)
    {
      n = Number(arguments[1]);
      if (n !== n)
        n = 0;
      else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0))
        n = (n > 0 || -1) * Math.floor(Math.abs(n));
    }

    if (n >= len)
      return -1;

    var k = n >= 0
          ? n
          : Math.max(len - Math.abs(n), 0);

    for (; k < len; k++)
    {
      if (k in t && t[k] === searchElement)
        return k;
    }
    return -1;
  };
}


답변

또한 결과를 확인하는 값이 모두 고유하기 때문에 Set.prototype.has () 도 사용할 수 있습니다 .

var valid = [1, 3, 12];
var goodFoo = 3;
var badFoo = 55;

// Test
console.log( new Set(valid).has(goodFoo) );
console.log( new Set(valid).has(badFoo) );