【问题标题】:Too Many "or" statements (javascript)太多“或”语句(javascript)
【发布时间】:2012-02-14 07:18:03
【问题描述】:

我正在创建一个包含 6 种不同问题类型的简单数学程序。我希望程序随机显示 6 种类型中的一种,但有些问题应该更频繁地出现。我使用加权数组,但是在从加权数组中选择问题类型后,如果没有在 if 语句中使用 10 个或更多“或”命令,我无法确定它是哪种问题类型。这是一个简化的版本:

//shuffle array of 10 integers to get a random value
var rand_10 = [0,1,2,3,4,5,6,7,8,9];
fisherYates(rand_10);

//Set weightedProb
weightedProb[0] = probType[0];
weightedProb[1] = probType[0];
weightedProb[2] = probType[0];
.
.
.
weightedProb[8] = probType[0];
weightedProb[9] = probType[1];

theProblem = weightedProb[rand_10[0]];
if(rand_10[0] == 0 || rand_10[0] == 1 || rand_10[0] == 2 || rand_10[0] == 3 ||rand_10[0] == 4||rand_10[0] == 5||rand_10[0] == 6||rand_10[0] == 7||rand_10[0] == 8){
  //do something
}else if(rand_10[0] ==9){
  //do something else
}

【问题讨论】:

  • 这是一个 javascript Fisher–Yates Shuffle bost.ocks.org/mike/shuffle
  • if(rand_10[0] >= 0 && rand_10[0] < 9) { } else { }
  • 如果你切换if,它会变得更容易:if (rand_10[0] === 9) {/*do something else*/} else {/*do something*/}

标签: javascript if-statement conditional-statements logical-operators logical-or


【解决方案1】:

你想要一个简单的范围比较(> 和<)吗?

例如

if(rand_10[0] >= 0 && rand_10[0] <= 8){
  //do something
}else if(rand_10[0] == 9){
  //do something else
}

【讨论】:

  • 好的,谢谢!正如我在下面所写的,我从未接受过正式培训,因此我的知识存在一些差距。感谢您填写这篇文章,它非常简单实用!
  • @user877011 如果您正在学习一个好的 Javascript 教程,请尝试 Mozilla Dev Centre page,然后当您适应了之后,请阅读 Javascript Garden。
  • 我也推荐(代码学院)[www.codeacademy.com]。
【解决方案2】:

你可以这样做(注意 indexOf 在某些 IE 版本中不受支持):

if ([0,1,2,3,4,5,6,7,8].indexOf(rand_10[0]) > -1) {
}

这是假设值并不总是一个范围,您需要精细控制。

【讨论】:

    【解决方案3】:

    你为什么不想这样写?

    if(rand_10[0] >= 0 && rand_10[0] <= 8){
      //do something
    }else if(rand_10[0] ==9){
      //do something else
    }
    

    【讨论】:

    • 谢谢!我从未接受过正式培训,因此我的知识有所欠缺,不过这非常简单且有用!
    【解决方案4】:

    arr = [ 1, 2, 3, 4, 5, 6, 7, 8]

    if (rand_10[0] in arr) {
    //...
    }
    

    【讨论】:

      【解决方案5】:

      你也可以使用 switch 语句:

       switch(rand_10[0]) {
         case 0:
         case 1:
         case 2:
         case 3:
         case 4:
         case 5:
         case 6:
         case 7:
         case 8:
           // do something
           break;
         case 9:
           // do something
           break;
       }
      

      【讨论】:

        【解决方案6】:

        最好使用生成加权随机索引的函数,如下所示:

        function weightedRandomIndex(weights) {
            var sum = 0, i, x, n=weights.length, rnd;
            for (i=0; i<n; i++) {
                sum += weights[i];
            }
            rnd = Math.floor(Math.random()*sum);
            for (i=0, x=0; i<n; i++) {
                x += weights[i];
                if (x > rnd) return i;
            }
        }
        

        然后你只需要指定权重来选择你的数组索引:

        var idx = weightedRandomIndex([9,1]);  // 9 to 1 chance for index 0 over index 1
        

        【讨论】:

        • 感谢您的评论。我实际上使用了一个函数来创建随机加权索引,但我认为它更难阅读,而且它与我所问的内容没有直接关系,所以我只是写了一个列表,而不是把函数放在我的问题中。不过谢谢!
        猜你喜欢
        • 1970-01-01
        • 2014-04-25
        • 1970-01-01
        • 2012-08-12
        • 1970-01-01
        • 2014-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多