我有一个用户可以点击的数百个数字的列表,每个数字对应一个以用户点击的相同数字结尾的场景变量,即如果用户选择“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);
}
这可能会持续数百次。如何编写上面的代码,以便为自己节省大量的工作。我如何有效地定义一个价值数百个这些场景变量的数组呢?
答案 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);
您不需要if
或switch
。
更新:为更安全eval()
添加了严格模式,docs