Javascript “替代方案”;开关";陈述

Javascript “替代方案”;开关";陈述,javascript,switch-statement,Javascript,Switch Statement,我不想在我的代码中使用Switch,所以我正在寻找一些替代方法 开关示例: function write(what) { switch(what) { case 'Blue': alert ('Blue'); break; ... case 'Red': alert ('Red'); break; } } colors = []; colors['Blue'] = function() { alert('Bl

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

}
不带开关的示例:

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

}
我的问题是:

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

}
  • 你知道其他的选择吗
  • 这是最好的解决方案吗

  • 另一种方法是使用
    write
    方法定义一个类,并重写子类
    Red
    Blue
    中的方法,以执行正确的操作


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

    您已经基本做到了这一点。如果可能,您可能希望添加一个帮助器函数,以使设置更容易。例如:

    function setup(what)
    {
        colors[what] = function() { alert(what); };
    }
    
    编辑:
    如果您想为每个选项执行的操作更为复杂,那么这显然是行不通的。正如@roe在评论中所提到的,这使用了经常被人不屑一顾的全局颜色。

    问题2:


    通常,如果您可以用字典查找来替换自定义控件结构,您就完全可以了。这本书很容易阅读,而且非常优雅——坚持下去。

    正如我所说,它很棒。我能添加到您的解决方案中的唯一一件事是,将
    颜色本地化可能更好

    function write(what) {
        var colors = [];
        colors['Blue'] = function() { alert('Blue'); };
        colors['Red'] = function() { alert('Red'); };
        colors[what]();
    }
    

    关于第二种方法,即存储非数字索引(在其他语言中称为关联数组),我只有一个注释

    你应该使用一个简单的对象

    此外,您可能希望检查传递给
    write
    函数的
    what
    参数是否作为
    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
      // ...
    }
    

    您可以使用对象文字,并尝试捕获默认值:

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

    我今天使用了这样的结构:

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

    我必须对列表中的一组对象道具进行比较,不想对所有可能性进行切换/案例,因此我首先将一组对象分配到一个数字等级,因此案例变成了一个简单的比较。这仅是4种可能性,但您了解了如何将其扩展到开关/机箱变得无法管理的情况:

    函数mySort2(item1,item2){

    var矩阵={
    "修复":4,,
    “r/r”:3,
    "部分":二,,
    “杂项”:1
    };  
    (矩阵[item1.category]<矩阵[item2.category])?返回+1:返回-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;
    
    i1=矩阵[item1.category]| |空;
    i2=矩阵[item2.类别]| |空;
    如果(i1==null){
    //处理项目1中的错误数据
    return+1;//放在2后面
    }
    如果(i2==null){
    //同上
    return-1;//将1放在第一位
    }
    
    如果(i1It’s great.Left it.yes,这是一个更好的解决方案,代码更少:)它也更干净,更容易阅读,可能会删除重复代码。这只适用于这个特定的例子,可能它们在现实中没有太多共同点。而且颜色在这里是全局的,这很少是一件好事。恕我直言,我认为你链接的文章错了。相反,不应该使用..in来迭代array@machine:那篇文章还谈到了
    for…in
    语句,以及当
    Array
    Object
    等内置构造函数的原型成员被扩展时会出现的问题,但这篇文章的底线是JavaScript数组是数字的,它们通常用于存储任意值键/值对这是一种糟糕的做法…底线?在数组上使用expando属性并不能改变这一事实。将最通用的对象之一转换为最不通用的对象是没有任何好处的。我不知道你为什么说“这篇文章也说明了问题”…我的理解是,这篇文章的重点是“更好地”支持for..in与array.short和simple的结合使用,就像它一样。+1只要chosenColor存在于colorString中,这就很酷。例如,如果chosenColor是“orange”,您将得到一个类型错误。事实上,您可以轻松地使用
    ({'red':'color is red'}[chosenColor]| |'default'
    谢谢@superzamp,我已经编辑了我的代码以添加默认选项。在2021年使用
    而不是
    | |
    。这是一个答案:使用开关/案例的替代方法。您还可以使用[]的[]来获得实际的值矩阵。