Проверьте равенство переменной на список значений
Я проверяю переменную, скажем foo
, для равенства целого числа значений. Например,
if( foo == 1 || foo == 3 || foo == 12 ) {
// ...
}
Дело в том, что это довольно много кода для такой тривиальной задачи. Я придумал следующее:
if( foo in {1: 1, 3: 1, 12: 1} ) {
// ...
}
но и это не полностью обращается ко мне, потому что я должен предоставлять избыточные значения элементам в объекте.
Кто-нибудь знает достойный способ проверки равенства с несколькими значениями?
Ответы
Ответ 1
Используя предоставленные ответы, я получил следующее:
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);
Ответ 2
Вы можете использовать массив и indexOf
:
if ([1,3,12].indexOf(foo) > -1)
Ответ 3
В ECMA2016 вы можете использовать метод includes. Это самый чистый способ, который я видел. (Поддерживается всеми основными браузерами, кроме IE (Polyfill находится в ссылке)
if([1,3,12].includes(foo)) {
// ...
}
Ответ 4
Вы можете написать 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;
};
Ответ 5
Это легко расширяется и читается:
switch (foo) {
case 1:
case 3:
case 12:
// ...
break
case 4:
case 5:
case 6:
// something else
break
}
Но не обязательно проще:)
Ответ 6
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;
};
}
Ответ 7
Кроме того, поскольку значения, по которым вы проверяете результат, уникальны, вы можете использовать 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) );
Ответ 8
Мне понравился принятый ответ, но подумал, что было бы неплохо позволить ему также брать массивы, поэтому я расширил его до этого:
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
Вы можете удалить принуждение типа, изменив ==
на ===
.
Ответ 9
Если у вас есть доступ к Underscore, вы можете использовать следующее:
if (_.contains([1, 3, 12], foo)) {
// ...
}
contains
, используемый для работы в Lodash (до V4), теперь вы должны использовать includes
if (_.includes([1, 3, 12], foo)) {
handleYellowFruit();
}
Ответ 10
Это маленькая вспомогательная функция arror:
const letters = ['A', 'B', 'C', 'D'];
function checkInList(arr, val) {
return arr.some(arrVal => val === arrVal);
}
checkInList(letters, 'E'); // false
checkInList(letters, 'A'); // true
Больше информации здесь...
Ответ 11
Я просто использовал функцию jQuery inArray и массив значений для этого:
myArr = ["A", "B", "C", "C-"];
var test = $.inArray("C", myArr)
// returns index of 2 returns -1 if not in array
if(test >= 0) // true
Ответ 12
Теперь у вас может быть лучшее решение для решения этого сценария, но другим способом, который я предпочел.
const arr = [1,3,12]
if( arr.includes(foo)) { // it will return true if you 'foo' is one of array values else false
// code here
}
Я предпочел вышеупомянутое решение над проверкой indexOf, где также нужно проверять index.
включает в себя документы
if ( arr.indexOf( foo ) !== -1 ) { }
Ответ 13
Для потомков вы можете использовать регулярные выражения в качестве альтернативы. Довольно хорошая поддержка браузера (ссылка https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/match#Browser_compatibility)
Попробуй это
if (foo.toString().match(/^(1|3|12)$/)) {
document.write('Regex me IN<br>');
} else {
document.write('Regex me OUT<br>');
}