我有一个非常长的条件语句,类似于以下内容:
if(test.type == 'itema' || test.type == 'itemb' || test.type == 'itemc' || test.type == 'itemd'){
// do something.
}
我在想是否能将这个表达式/语句重构为更简洁的形式。
你有什么想法吗?
我有一个非常长的条件语句,类似于以下内容:
if(test.type == 'itema' || test.type == 'itemb' || test.type == 'itemc' || test.type == 'itemd'){
// do something.
}
我在想是否能将这个表达式/语句重构为更简洁的形式。
你有什么想法吗?
对于非常长的字符串列表,这种方法可以节省一些字符(并不是说我会推荐在实际应用中使用,但它应该有效)。
选择一个你知道在测试中不会出现的字符作为分隔符,将它们全部放入一个长字符串中并进行搜索:
if ("/itema/itemb/itemc/itemd/".indexOf("/"+test.type+"/")>=0) {
// doSomething
}
if ("itemaitembitemcitemd".indexOf(test.type)>=0) {
// doSomething
}
但在这种情况下,您必须小心防止误报(例如,“embite”将在该版本中匹配)
我最喜欢的方法之一是使用像underscore.js这样的库来实现...
var isItem = _.some(['itema','itemb','itemc','itemd'], function(item) {
return test.type === item;
});
if(isItem) {
// One of them was true
}
some
是EC5中Array原型上的一个函数。 - KaptajnKoldif ('a' in oc(['a','b','c'])) { //dosomething }
function oc(a)
{
var o = {};
for(var i=0;i<a.length;i++) o[a[i]]='';
return o;
}
('a' in oc(['a','b','c'])) && statement;
('a' in oc(['a','b','c'])) && (statements,statements);
('a' in oc(['a','b','c']))?statement:elseStatement;
('a' in oc(['a','b','c']))?(statements,statements):(elseStatements,elseStatements);
如果您想进行反向操作
('a' in oc(['a','b','c'])) || statement;
我认为写这种if条件有两个目标。
因此,有时候#1可能是最快的,但我会选择#2以便后期易于维护。根据情况,我经常选择Walter答案的变体。
首先,我有一个全局可用的函数作为我的现有库的一部分。
function isDefined(obj){
return (typeof(obj) != 'undefined');
}
当我想要运行类似于你的if条件时,我会创建一个带有有效值列表的对象:
var validOptions = {
"itema":1,
"itemb":1,
"itemc":1,
"itemd":1
};
if(isDefined(validOptions[test.type])){
//do something...
}
这种方法不像使用switch/case语句那样快速,并且比其他一些示例更冗长,但我经常在代码的其他地方重复使用该对象,这可能非常方便。
在上面jsperf样本之一的基础上,我添加了这个测试和一个变体来比较速度。 http://jsperf.com/if-statements-test-techsin/6 我注意到最有趣的事情是,在Firefox中的某些测试组合甚至比Chrome还要快。
test = {};
test.type = 'itema';
for(var i=['itema','itemb','itemc']; i[0]==test.type && [
(function() {
// do something
console.log('matched!');
})()
]; i.shift());
in
吗? - jeremy||
. (2)switch
语句. (3) 正则表达式. (4)~
. http://jsperf.com/if-statements-test-techsin - Muhammad Umer