替换“切换”声明

时间:2010-02-21 19:32:19

标签: javascript switch-statement

我不想在我的代码中使用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]();

}

我的问题是:

  1. 你知道其他任何选择吗?
  2. 这是最好的解决方案吗?

8 个答案:

答案 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方法定义一个类,并在子类RedBlue中重写该方法以做正确的事。

这是否优于您提出的解决方案,取决于您的具体情况。

答案 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]();
}