1

使用类似于以下的嵌套条件,您如何优化分支以增强性能和/或可读性?由于许多潜在案例中存在循环,因此将重复条目合并为更实用的功能会更有效。

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

将条件放在总体 for 循环中似乎同样不合理。

理想情况下,目标变量可以在开始时立即定义,当条件已知时 - 因为条件 a 总是产生颜色 c 为 0,颜色 b 为 1,黑色颜色为 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 有时可能很危险。

4

3 回答 3

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 循环中显示代码,则最好进行优化。

于 2013-10-02T14:39:32.753 回答
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];
}
于 2013-10-02T15:15:34.837 回答
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;
    }
}

那有意义吗?

于 2013-10-02T14:33:46.477 回答