2013-05-25 2 views
0

Может быть, я что-то пропустил, но там лучше/краткий способ писать что-то вроде этого:Краткий способ сравнения нескольких значений элементов в Javascript/jQuery?

var a=1, 
    b=2, 
    c=3; 
if(a===1 && b===1 && c===1){ do something }; 

или

if(a===1 || b===1 || c===1){ do something }; 

Я пытаюсь сохранить код маленький, так что не являюсь поиск итераций через массивы и т. д., как это предлагается на страницах, с которыми я сталкивался. Я бы подумать, что было бы что-то (по крайней мере, для первого примера, где они все-таки), который будет выглядеть как

if(a=b=c===1){ do something? }; 

Спасибо!

ответ

2

Нет, нет. Вы должны проверить их индивидуально. У JavaScript просто нет оператора для того, что вы пытаетесь сделать.

Ваш if(a=b=c===1){ ... (который я понимаю, был просто пример) будет установитьa и b быть true (если c===1) или false (если это не так), а затем филиал основан только на c===1.

Я имею в виду, для этого конкретный кейс, есть пара математических подходов, но в общем случае нет.

+0

Хотя есть много других отличных ответов на этот вопрос, кажется, что этот является самым близким. @squint решение приятно, и я могу использовать это в чем-то в будущем, хотя спасибо! – Aaron

0

В зависимости от того, сколько вы хотите инвестировать, это было бы возможным решением:

var slice=Function.call.bind([].slice) 

var checkCondition=function(condition){ 
    return function(){ 
     return slice(arguments).reduce(function(o,n){ 
      return o && o == condition(n); 
     },true); 
    } 
} 

greater5=checkCondition(function(x){ return x>5; }); 

console.log(greater5(4,7)); 

Если у вас есть только в вашем коде один или два раза, где вы должны проверить несколько переменных было бы совершенно излишним , Но если у вас несколько мест с различными аргументами, это может помочь.

Вы можете легко определить новые проверки по определению другой функции и добавить столько переменных, сколько захотите.

+1

Имейте в виду, что '.reduce()' не замыкает оценку, поэтому результат, который вы получите, будет заключаться в том, соответствует ли результат последней проверки условия последнему последнему. Итак, 'g5 (4,4); // true' ... 'g5 (4,4,4); // false' ... и непрерывное чередование. Вы можете добавить короткое замыкание в оценку в возвращаемом значении '.reduce()' для его обработки. 'return o && o == condition (n);' –

4

Вы можете принять функциональный подход, и создать простую функцию сравнения генератор:

function eq(val) { 
    return function(x) { 
     return x === val 
    } 
} 

И затем использовать .every для &&:

if ([a,b,c].every(eq(1))) { 
    // all were equal 
} 

Или используйте .some для ||:

if ([a,b,c].some(eq(1))) { 
    // at least one was equal 
} 

Вы также можете создать функцию, которая получает результат состояния и функцию для вызова, когда условие было верно:

function when(cond, fn) { 
    if (cond) 
     fn.call.apply(fn, [].slice.call(arguments, 2)) 
} 

И инкапсулировать if тела в функцию ...

function doIt(arg1, arg2) { 
    console.log("doing it!") 
    console.log(this, arg1, arg2) 
} 

Затем использовать его как это:

when([a,b,c].every(eq(1)), doIt, null, "foo", "bar") 

Третий аргумент when устанавливает значение обратного вызова this, и последующие аргументы передаются в качестве аргументов функции обратного вызова.

+1

+1 Мне нравится функциональный подход, если это что-то очень много. –

Смежные вопросы