Verificar a igualdade de variables ​​em relação a uma lista de valores

Estou verificando uma variável, digamos foo , por igualdade para um número de valores. Por exemplo,

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

O ponto é que é bastante código para uma tarefa tão trivial. Eu vim com o seguinte:

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

mas também isso não me atrai completamente, porque eu tenho que dar valores redundantes para os itens no object.

Alguém sabe uma maneira decente de fazer uma verificação de igualdade contra vários valores?

Você poderia usar uma matriz e indexOf :

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

No ECMA2016, você pode usar o método includes . É a maneira mais limpa que eu vi. (Suportado por todos os principais navegadores, exceto o IE (Polyfill está no link)

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

Usando as respostas fornecidas, acabei com o seguinte:

 Object.prototype.in = function() { for(var i=0; i 

Pode ser chamado como:

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

Edit: Eu me deparei com este 'truque' ultimamente que é útil se os valores são seqüências de caracteres e não contêm caracteres especiais. Para caracteres especiais, torna-se feio devido à fuga e também é mais propenso a erros devido a isso.

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

Para ser mais preciso, isso irá verificar a string exata, mas novamente é mais complicado para um teste de igualdade simples:

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

Você pode escrever if(foo in L(10,20,30)) se você definir L para ser

 var L = function() { var obj = {}; for(var i=0; i 
 var a = [1,2,3]; if ( a.indexOf( 1 ) !== -1 ) { } 

Note que indexOf não está no núcleo ECMAScript. Você precisará ter um snippet para o IE e possivelmente outros navegadores que não suportam 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; }; } 

Isso é facilmente extensível e legível:

 switch (foo) { case 1: case 3: case 12: // ... break case 4: case 5: case 6: // something else break } 

Mas não necessariamente mais fácil 🙂

Eu gostei da resposta aceita, mas achei que seria legal permitir que ela pegasse matrizes também, então eu a expandi para isto:

 Object.prototype.isin = function() { for(var i = arguments.length; i--;) { var a = arguments[i]; if(a.constructor === Array) { for(var j = a.length; j--;) if(a[j] == this) return true; } else if(a == this) return true; } return false; } var lucky = 7, more = [7, 11, 42]; lucky.isin(2, 3, 5, 8, more) //true 

Você pode remover a coerção de tipo alterando == para === .

Se você tiver access ao sublinhado, você pode usar o seguinte:

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

contains usado para trabalhar em Lodash também (antes de V4), agora você tem que usar includes

 if (_.includes([1, 3, 12], foo)) { handleYellowFruit(); } 

Além disso, como os valores em relação aos quais você está verificando o resultado são todos exclusivos, você também pode usar o 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) ); 

Eu simplesmente usei a function jQuery inArray e uma matriz de valores para realizar isso:

 myArr = ["A", "B", "C", "C-"]; var test = $.inArray("C", myArr) // returns index of 2 returns -1 if not in array if(test >= 0) // true 

Aqui está a function auxiliar para comparar um valor com o valor múltiplo:

 // equalAgainstMultiple returns true if one of the given option is equal to given value function equalAgainstMultiple(value: T, options: Array): boolean { for (let i = 0; i < options.length; i += 1) { if (options[i] === value) { return true; } } return false; } 

Para a posteridade, você pode querer usar expressões regulares como uma alternativa. Muito bom suporte ao navegador também (ref. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/match#Browser_compatibility )

Tente isso

 if (foo.toString().match(/^(1|3|12)$/)) { document.write('Regex me IN
'); } else { document.write('Regex me OUT
'); }