2015-06-22 62 views
9
if (Progress.bar.status == 'finished' || Progress.bar.status == 'uploading'){ 
    //code here 
} 

如何缩短这个?我想编写它而不必重复Progress.bar.status两次。快捷方式比较语句

线沿线的东西:

Progress.bar.status == ('finished' or 'uploading'). 
+1

'Progress.bar.status? ('完成'||'上传'):'别的东西' –

+0

其他可能的值是什么? –

+0

@SwarajGiri,这不起作用,因为任何非空字符串返回true,并强制''完成''返回。但是'//代码在这里'的要求不是(不能)实现的。 –

回答

16

我喜欢查找表:

if ({finished:1, uploading:1}[Progress.bar.status]){ 
    //code here 
} 

此使用对象代码的两个或更多的选择,甚至侧面步骤引用的每一个选择。它也非常快,因为对象可以缓存并没有比较的逻辑或方法来调用,只需快速属性访问驱动流...

做注意到,在某些情况下,你可能需要使用Object.create(null)然后如果您绝对必须避免“hasOwnProperty”,“valueOf”,“toString”,“toLocaleString”,“构造函数”和一些双下划线扩展的误报,可以合并/扩展该空白对象与选项。这通常不是一个问题,但需要牢记。如果您可以在不添加if这些关键字的情况下生活,或者从Object.create()构建缓存的选择集合,那么这是一种编码“上述之一”流程的快速而简单的方法。

+0

不错,不知道。 – hsz

+0

为什么在** {{finished:1,上传:1} **)中添加_1_? –

+1

'1'是一个值,它将满足'if('当键匹配并且键入快时,任何thruthy值都会做,但是对于很多progs,'1'表示是,'0'表示不。 – dandavis

4

请与想要的字符串数组,申请数组的索引的搜索。结果是-1未找到,0..n找到的字符串。使这个短,而我们只需要0 ... N结果,应用按位不结果(https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators#Bitwise_NOT) :

value ~value boolean 
-1 => 0 => false 
    0 => -1 => true 
    1 => -2 => true 
    2 => -3 => true 
    and so on 

在代码一起,它看起来是这样的:

if (~['finished', 'uploading'].indexOf(Progress.bar.status)) { 
    // code here 
} 
+0

你能解释一下吗? – ozil

+0

@ ozil,我们走吧。 –

4

我可以建议用枚举的那么switch()声明:最初

var Status = { 
    Finished: 'finished', 
    Uploading: 'uploading' 
}; 

switch (Progress.bar.status) { 
    case Status.Finished: 
    case Status.Uploading: 
     //code here 
     break; 
} 

更多的代码,但更灵活和可读性。

0

我知道,扩展原生对象是一个禁忌,但:

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

if(Progress.bar.status.eqOr('finished', 'uploading')){ 
    //code here 
} 

V2.0,感谢杰克

String.prototype.eqOr = function(){ 
    return [].indexOf.call(arguments, this.toString()) !== -1; 
} 
+0

'return [] .indexOf.call(arguments,this)!== -1;':) –

+0

or bake a take-away:'isOk = []。indexOf.bind(['finished','uploading']] );' – dandavis