在我的小项目中,我提出了两个选项:交换机如何工作:
switch (_toler) {
case '20': var kto='M'; break;
case '10': kto='k / K'; break;
case '5': kto='J'; break;
case '2': kto='G'; break;
case '1': kto='F'; break;
case '0.5': kto='D'; break;
case '0.25': kto='C'; break;
case '0.1': kto='B'; break;
case '0': default: kto='/'; break;
}
和
var wert=["20","10","5","2","1","0.5","0.25","0.1","0"];
var kurz=["M","k / K","J","G","F","D","C","B","/"];
for (i=0; i<9; i++) {
if (_toler==wert[i]) {kto=kurz[i]}
}
您更喜欢哪一个?我不知道什么是更好的,因为第二个选项是更少的代码。
答案 0 :(得分:2)
由于您将 _toler
值映射到kto
值,因此请使用地图 - 在JS中是一个对象。
var map = {
'20': 'M',
'10': 'k / K',
'5' : 'J',
'2' : 'G',
'1' : 'F',
'0.5' : 'D',
'0.25' : 'C',
'0.1' : 'B',
'0' : '/'
};
kto = map[_toler];
到目前为止,这不仅是性能方面的最佳选择(由于它被简化为简单的属性查找),如果您需要更改,添加或删除映射,它也更容易阅读和维护。
答案 1 :(得分:0)
鉴于案例数量较少,任何性能差异都可以忽略不计,因此从代码可读性的角度来看,for循环会更好。
如果您仍然关注性能而不是在这种情况下开关速度更快,因为循环会多次检查结束条件,而开关只会检查一次。这称为loop unrolling
,优化编译器主要在自己的
答案 2 :(得分:0)
你得到一些亲密的选票,因为你问“你更喜欢哪一个?”我认为你的问题足够有效,但你应该将其称为“这些选项的优缺点是什么?”
您实际上还有另一个选项甚至不在您的列表中:
var wert = [/* stuff */];
var kurz = [/* stuff */];
kto = kurz[wert.indexOf(__toler)] || kurz[0];
此代码的作用是获取indexOf()
__toler
,它将是索引,或者是-1
。如果是-1
,那么kurz[-1]
将为undefined
,然后会回退到kurz[0]
默认情况。这是最紧凑的。这种方法完全优于你的循环版本(虽然它的Big-O仍然大致相同)。
这样做的好处是可以更轻松地拥有大量的列表,并且可以让您在运行时轻松修改它。
对此的缺点是,如果您不熟悉该模式,理解它可能有点棘手。
开关模式更容易阅读,并且显而易见。这可能是很多代码,并且有很多冗余(kto=
)。
一般来说,当你只是用值做同样的事情时,第一个会更好。