使用类似于以下内容的嵌套条件,您如何优化分支以提高性能和/或可读性?由于在许多潜在案例中存在循环,因此将重复条目合并为更实用的函数会更有效。
//a is defined either 1, 2, or 3
//b is defined either true or false
for(var i=0; i<hugeNumber; i++){
switch(a){
case 1:
if(b){
for(objects in longlist){
objects.color = object.c;
objects.position = object.x
}
}else{
for(objects in longlist){
objects.color = object.c;
objects.position = object.y
}
case 2:
if(b){
for(objects in longlist){
objects.color = object.b;
objects.position = object.x;
}
}else{
for(objects in longlist){
objects.color = object.b;
objects.position = object.y;
}
case 3:
if(b){
for(objects in longlist){
objects.color = blackColor;
objects.position = object.x;
}
}else{
for(objects in longlist){
objects.color = blackColor;
objects.position = object.y;
}
}
}
将条件放在一个总体循环中似乎是不合理的。
理想情况下,目标变量可以在开始时定义,当条件已知时立即定义 - 条件a总是产生颜色c为0,颜色b为1,blackColor为2,而条件b总是产生位置x为真并将y置为假。
我已经看到PHP和Ruby的这个问题的变体,但我不太确定如何将解决方案应用于JavaScript。我可以想到一些可行的方法,但到目前为止我还没能在语法上使代码功能化。
更新/解决方案:答案促使我发现可以使用eval()
高效完成此操作:
var targetColor;
var targetPosition;
switch(a){
case 1: targetColor = "objects.c"; break;
case 2: targetColor = "objects.b"; break;
case 3: targetColor = "blackColor"; break;
}
if(b){
targetPosition = "objects.x";
}else{
targetPosition = "objects.y";
}
for(var i=0; i<hugeNumber; i++){
for(objects in longlist){
objects.color = eval(targetColor);
objects.position = eval(targetPosition);
}
}
如果有更好的方法,我绝对愿意接受其他建议 - 我知道eval有时会很危险。
答案 0 :(得分:1)
var colorToBeApplied = (a === 0 ? "c" : (a === 1 ? "b" : "blackColor"));
var position = b ? "x" : "y";
for(objects in longlist) {
objects.color = colorToBeApplied;
objects.position = position;
}
如果你可以在for循环中显示代码,那么最好进行优化。
答案 1 :(得分:1)
小巧但不易读,没有不必要的重新检查:
var coord = b ? 'x' : 'y';
var col = '';
switch(a){
case 1: col = 'c';
case 2: col = 'b';
// may add more cases...
}
for(objects in longlist) {
object.color = object[col] || 'blackColor';
object.position = object[coord];
}
答案 2 :(得分:0)
使用你所描述的逻辑,我觉得这是在最小线数和可读性之间的一个不错的地方。
for(objects in longList) {
object.pos = b ? x : y;
switch(a) {
case 1: object.color = c;
case 2: object.color = b;
case 3: object.color = backColor;
}
}
这有意义吗?