我不想在我的代码中使用Switch,所以我正在寻找一些替代
Switch的示例:
function write(what) {
switch(what) {
case 'Blue':
alert ('Blue');
break;
...
case 'Red':
alert ('Red');
break;
}
}
没有开关的示例:
colors = [];
colors['Blue'] = function() { alert('Blue'); };
colors['Red'] = function() { alert('Red'); };
function write(what) {
colors[what]();
}
我的问题是:
答案 0 :(得分:20)
我只有一个关于你的第二种方法的注释,你shouldn't use an Array存储非数字索引(你可以用其他语言调用关联数组)。
你应该使用一个简单的对象。
此外,您可能想要检查传递给what
函数的write
参数是否作为colors
对象的属性存在,并查看它是否为函数,因此您可以调用它没有运行时错误:
var colors = {};
colors['Blue'] = function() { alert('Blue'); };
colors['Red'] = function() { alert('Red'); };
function write(what) {
if (typeof colors[what] == 'function') {
colors[what]();
return;
}
// not a function, default case
// ...
}
答案 1 :(得分:5)
我今天使用了这样的结构:
var chosenColor = 'red';
var colorString = {
'red': 'The color is red.',
'green': 'The color is green.',
'blue': 'The color is blue.',
}[chosenColor] || 'The color is unknown.';
我喜欢根据选择选择字符串的代码非常少。
你也可以将它传递给一个函数:
alert({
'red': 'The color is red.',
'green': 'The color is green.',
'blue': 'The color is blue.',
}[chosenColor] || 'The color is unknown.');
答案 2 :(得分:2)
您可以使用对象文字,并尝试使用catch来捕获默认值:
function write(what) {
var colors = {
'Blue': function(){ alert('Light-Blue'); },
'Red': function(){ alert('Deep-Red'); },
'Green': function(){ alert('Deep-Green'); }
}
try {colors[what]();}
catch(err) {colors['Green']();}//default behaviour
}
write('Pink');
答案 3 :(得分:1)
问题2:
通常,如果您可以使用字典查找替换自定义控件结构,那么您就完全没问题了。它易于阅读,非常优雅 - 坚持下去。
答案 4 :(得分:1)
我必须对列表的一组对象道具进行比较,并且不想为所有可能性做一个开关/案例,所以我首先将一个对象数组分配给一个数字等级所以变得简单比较。这只有4种可能性,但是您可以将这种情况扩展到开关/案例无法管理的情况:
function mySort2(item1,item2){
var matrix = {
'repair': 4,
'r/r': 3,
'part': 2,
'misc': 1
};
(matrix[item1.category] < matrix[item2.category]) ? return +1 : return -1;
//如果可能的坏数据需要首先检查这个???
i1=matrix[item1.category] || null;
i2=matrix[item2.category] || null;
if (i1==null){
// handle bad data in item 1
return +1; // put it after 2
}
if (i2==null){
// ditto
return -1; //put 1 first
}
if (i1<i2)
return +1;
else
return -1;
}
答案 5 :(得分:0)
另一种方法是使用write
方法定义一个类,并在子类Red
和Blue
中重写该方法以做正确的事。
这是否优于您提出的解决方案,取决于您的具体情况。
答案 6 :(得分:0)
你已经在那里了。如果可能,您可能需要添加辅助函数以使设置更容易。例如:
function setup(what)
{
colors[what] = function() { alert(what); };
}
修改强>
如果您想为每个选项做的事情更复杂,那么这将无效。正如@roe的评论中所提到的,它使用的是全局颜色,这通常是不受欢迎的。
答案 7 :(得分:0)
正如我所说,这很棒。我可以添加到您的解决方案中的唯一方法是,将colors
本地化可能更好。
function write(what) {
var colors = [];
colors['Blue'] = function() { alert('Blue'); };
colors['Red'] = function() { alert('Red'); };
colors[what]();
}