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 は常に 0 の場合はカラー c、1 の場合はカラー b、2 の場合は blackColor を生成し、条件付き b は常に true の場合は位置 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 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 に答える