【发布时间】:2013-10-02 14:18:06
【问题描述】:
使用类似于以下的嵌套条件,您如何优化分支以提高性能和/或可读性?由于许多潜在案例中存在循环,因此将重复条目合并为更实用的函数会更有效。
//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 为 false。
我已经看到这个问题针对 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 有时可能很危险。
【问题讨论】:
-
object.c和object.x是什么?它们是longlist对象中的属性吗? -
没错——它们是对象的属性。
-
请在
for (objects in longlist){...部分之一中显示代码。 -
@thefourtheye 已更新 - 使用 cmets 肯定会混淆手头的问题,谢谢。
-
谢谢 :) 无论如何要小心
eval,只有在您确定将什么作为字符串传递给它时才使用它(例如,查看闭包链并评估添加正则表达式的可能性必要时检查字符串的内容)
标签: javascript optimization code-readability