【问题标题】:Multiple Ternary Operators多个三元运算符
【发布时间】:2011-12-07 03:18:28
【问题描述】:

我需要一些关于三元运算符的语法帮助,这将帮助我将正确的标记图标放在我的好地图上。我有三个区域 0、1 和 2,它们具有唯一的图标 0、1 和 2。

我以前只有两个区域,所以这个三元运算符工作得很好;

var icon = (area == 1) ? icon1 : icon0;

现在我需要为 area2 添加一个额外的第三个图标 (icon2)。

我尝试了各种方法,但似乎都无法正确。

【问题讨论】:

    标签: javascript conditional-operator


    【解决方案1】:

    语法是:

    var icon = (area == 1) ? icon1 : (area == 2) ? icon2 : icon0;
    

    但这开始变得复杂了。你最好只创建一个函数来完成这项工作:

    var icon = getIcon(area);
    
    function getIcon(area) {
      if (area == 1) { 
        return icon1; 
      } else if (area == 2) { 
        return icon2; 
      }
    
      return icon0;
    }
    

    【讨论】:

    • 写完后,我意识到0总是映射到icon0,所以Pointy的答案更可取。但是,如果在这种情况下您需要一个“包罗万象”的值,例如 icon0,这种方法仍然可行。
    • 谢谢贾斯汀,我认为这个功能最适合我的需要。我还发现与三元运算符一起工作更友好,三元运算符可能会随着时间的推移变得更大。谢谢。
    【解决方案2】:

    对于任何对多重三元语法感到困惑的人(就像我一样),它是这样的:

    var yourVar = condition1 ? someValue
                : condition2 ? anotherValue
                : defaultValue;
    

    您可以添加任意数量的条件。

    您可以进一步阅读https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Conditional_Operator

    【讨论】:

      【解决方案3】:

      怎么样:

      var icon = [ icon0, icon1, icon2 ][area];
      

      【讨论】:

      • 这个操作叫什么?
      • @JM-AGMS 这只是一个简单的数组索引操作。 area 变量包含一个数字。
      • ['A', 'B', 'C'][area] 所以如果面积 = 2,C 会是值吗?我从没想过同时定义和设置数组索引。
      • @JM-AGMS 是的,没错。数组字面量与值为数组的变量一样是数组。
      • 如果你想让 icon0 成为一个后备,那就是icon: { 1: icon1, 2: icon2 }[area] || icon0
      【解决方案4】:

      对象字面量怎么样。

      icons = {
          0: icon0,
          1: icon1,
          2: icon2
      }
      
      icon = icons[area];
      

      【讨论】:

        【解决方案5】:

        很简单的方法

        如果你的对象是这样的:

        var obj = {
          x: true,
          y: {
            xy: 'some value'
          }
        }
        
        var result = obj ? obj.y ? obj.y.xy ? obj.y.xy : 'N/A' : 'N/A' : 'N/A'
        
        console.log(result) // "some value"

        【讨论】:

        • 这不是一个很好的测试,因为test1 ? test1 : (test2 ? test2 : 'some default value')(test1 ? test1 : test2) ? test2 : 'some default value' 都给出了相同的结果
        • 更好的测试是:var test = true; var result = test===true ? 'it is true' : test===false ? 'it is false' : 'it is null'。这样,当您将最后两个运算符 test===true ? 'it is true' : (test===false ? 'it is false' : 'it is null') 分组时,您会得到 'it is true'(正确),但是当您将前两个运算符 (test===true ? 'it is true' : test===false) ? 'it is false' : 'it is null' 分组时,您会得到 'it is false'(不正确)。这个测试更好,因为它显示了隐式运算符分组。
        【解决方案6】:
        var icon = (area == 0) ? icon0 : (area == 1) ? icon1 : icon2;
        

        【讨论】:

        • 快速问:括号有必要吗?
        • @BugWhisperer 我相信你的意思是括号,没有括号不是必需的,只是试图显示分离。
        • 是的,这就是我的意思。好的,我知道在某些情况下括号是必要的,这就是我问的原因
        猜你喜欢
        • 2014-04-04
        • 2020-04-29
        • 2021-07-20
        • 1970-01-01
        • 2017-03-09
        • 2013-06-06
        • 2019-11-26
        • 2011-06-26
        • 2015-08-29
        相关资源
        最近更新 更多