使用数百个块的if else语句的有效方法

时间:2016-10-28 11:33:10

标签: javascript

我有一个用户可以点击的数百个数字的列表,每个数字对应一个以用户点击的相同数字结尾的场景变量,即如果用户选择“43”,renderer.render(执行了scene43,相机)。

//jumpSwitcher is defined the numerical value that the user has clicked on 
jumpSwitcher = +value;

if (jumpSwitcher == 1) {
     renderer.render(scene1, camera);
} else if (jumpSwitcher == 2) {
     renderer.render(scene2, camera);
} 

这可能会持续数百次。如何编写上面的代码,以便为自己节省大量的工作。我如何有效地定义一个价值数百个这些场景变量的数组呢?

7 个答案:

答案 0 :(得分:9)

我建议使用"文字对象"

var conditions = {
    "1": ..., // treat condition to 1
    "2": ... // treat condition to 2
    "default": ... // default treatment
}

var treatment = conditions[scene] || conditions.default;

答案 1 :(得分:5)

使用数组。

var scenes = [ null, scene1, scene2, scene3 ];
renderer.render(scenes[jumpSwitcher], camera);

答案 2 :(得分:2)

一种方法是使用eval(),但don't

您可以使用以下方法填充场景数组:

scenes = Array.apply(null, Array(100)).map(function () {return new Scene();});

或者,使用ES6,

scenes = Array.from(Array(100), () => new Scene())

然后使用:

renderer.render(scenes[jumpSwitcher-1], camera);

答案 3 :(得分:2)

如果你有连续的数字,你可以使用一个数组

scenes = [scene0, scene1, ..., sceneN ]
// access
renderer.render(scenes[scene], camera);

或带有间隙的数字的对象

scenes = { 10: scene10, 15: scene15 }
// access
renderer.render(scenes[scene], camera);

Map

scenes = new Map([[4, scene4], [20, scene20]]);
// access
renderer.render(scenes.get(scene), camera);

另一种可能性是使用编程样式早期返回,这意味着,如果满足条件,则创建一个条件并结束该函数。

function callScene(scene) {
    if (scene === 1) {
        renderer.render(scene1, camera);
        return;
    }
    if (scene === 2) {
        renderer.render(scene2, camera);
        return;
    }
    // ...
}

答案 4 :(得分:1)

使用switch语句,例如

switch(jumpSwitcher)
{
    case 1: {renderer.render(scene1, camera); break;}
    ...
}

答案 5 :(得分:1)

由于场景似乎是全局变量,您也可以使用:

renderer.render(window['scene' + jumpSwitcher], camera);

没有eval,单行,变量scene号码......它没有比这更简单。

如果场景不在window上,请将其替换为适当的范围对象。 (例如this)。

答案 6 :(得分:-10)

只需写下:

"use strict";
renderer.render(eval('scene' + jumpSwitcher), camera);

您不需要ifswitch

更新:为更安全eval()添加了严格模式,docs