在Javascript / jQuery中比较多个元素值的简洁方法?

时间:2013-05-25 16:59:27

标签: javascript jquery variables comparison

也许我错过了一些东西,但有更好/更简洁的方式写这样的东西:

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? };

谢谢!

3 个答案:

答案 0 :(得分: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 :(得分:2)

不,没有。你必须单独检查它们。 JavaScript只是没有你想要做的操作符。

您的if(a=b=c===1){ ...(我意识到这只是一个示例) ab设为true(如果{{1} }}或c===1(如果没有),然后仅基于false进行分支。

我的意思是,对于特定的案例,有几种数学方法,但在一般情况下,没有。

答案 2 :(得分: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));

如果您的代码中只有一到两次必须检查多个变量,那么绝对是过度的。但是如果你有多个地方有不同的参数,它可能会有所帮助。

您可以通过定义另一个函数轻松定义新检查,并根据需要添加任意数量的变量。