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

Efficient way to if else statement with hundreds of blocks

本文关键字:if else 语句 方法 有效 百块      更新时间:2023-09-26

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

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

这可能会持续数百次。我如何写上面的代码,这样我可以节省自己很多的工作。如何有效地定义一个包含数百个场景变量的数组?

我建议使用"literal object"

var conditions = {
    "1": ..., // treat condition to 1
    "2": ... // treat condition to 2
    "default": ... // default treatment
}
var treatment = conditions[scene] || conditions.default;

使用数组

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

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

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

一种方法是使用eval(),但不要使用。

您可以使用以下命令填充一个场景数组:

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);

使用switch语句,例如

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

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

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

eval,单行,可变scene数…没有比这更简单的了。

如果场景不在window上,请替换为合适的作用域对象。(例如this).

就这样写:

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

你不需要ifswitch

UPDATE:eval(), docs添加严格模式