【问题标题】:Why my code with switch(true) and Array.concat() doesn't work properly为什么我的带有 switch(true) 和 Array.concat() 的代码不能正常工作
【发布时间】:2019-07-30 10:15:55
【问题描述】:

//JavaScript:

    function concatArrays() {
      var recentlyCompleted = ["rc1", "rc2"];
      var upcomingActivities = [];
      var decisionsRequired = [];
      var records = [];
        switch(true) {
          case (recentlyCompleted.length >0):
            records.concat(recentlyCompleted);
            console.log("recentlyCompleted.length >0");
            console.log(records);
          case (upcomingActivities.length >0):
            records.concat(upcomingActivities);
            console.log("upcomingActivities.length >0");
            console.log(records);
          case (decisionsRequired.length >0):
            records.concat(decisionsRequired);
            console.log("decisionsRequired.length >0");
            console.log(records);
            break;
        }
      document.getElementById("demo").innerHTML = JSON.stringify(records);
      
      var records2 = recentlyCompleted.concat(upcomingActivities).concat(decisionsRequired);
      document.getElementById("demo2").innerHTML = JSON.stringify(records2);
    }
    <head>
      <meta charset="utf-8">
      <meta name="viewport" content="width=device-width">
      <title>switch(true)</title>
    </head>
    <body>
      <p>Click the button to join arrays.</p>
      <button onclick="concatArrays()">Try it</button>
      <p id="demo"></p>
      <p id="demo2"></p>
    </body>

对不起,我已经读过,与明显的 if else if 序列相比的主要优势是能够省略 break 语句并执行多个块。我想在我的 case(true) 代码中执行多个块。但我发现这个简单的代码有问题。

非常抱歉,您能否用 switch(true) 解释这段代码的部分问题 谢谢!

执行多个块:

正确答案的执行截图:

function concatArrays() {
  var recentlyCompleted = ["rc1", "rc2"];
  var upcomingActivities = [];
  var decisionsRequired = [];
  var records = [];
  switch (true) {
    case (recentlyCompleted.length > 0):
      records = records.concat(recentlyCompleted);
      console.log("recentlyCompleted.length >0");
      console.log(records);
    case (upcomingActivities.length > 0):
      records = records.concat(upcomingActivities);
      console.log("upcomingActivities.length >0");
      console.log(records);
    case (decisionsRequired.length > 0):
      records = records.concat(decisionsRequired);
      console.log("decisionsRequired.length >0");
      console.log(records);
      break;
  }
  document.getElementById("demo").innerHTML =
    JSON.stringify(records);

  var records2 = recentlyCompleted
    .concat(upcomingActivities)
    .concat(decisionsRequired);
  document.getElementById("demo2").innerHTML =
    JSON.stringify(records2);
}

【问题讨论】:

  • switch: "switch 语句首先计算它的表达式。然后它查找第一个 case 子句,其表达式的计算结果与输入表达式的结果相同(使用严格的比较,===) 并将控制转移到该子句,执行相关的语句。(如果多个案例与提供的值匹配,则选择第一个匹配的案例,即使案例不相等.)"
  • 在 Switch 中只允许相等的条件。否则使用 IF 语句。

标签: javascript arrays concat


【解决方案1】:

没有breakcase 不会重新评估下一个case 是否相等,而是无条件地运行该块-称为fallthrough。我怀疑这是你想要的。请改用多个连续的if 语句(而不是if-else 链)- 如果您不关心日志语句,则直接使用records2 方法。

其次,concat 创建一个新数组,它不会通过附加到它来改变目标。请参阅How to append something to an array?How to extend an existing JavaScript array with another array, without creating a new array 了解各种解决方案。

【讨论】:

  • 谢谢@Bergi! concat 创建一个新数组,它不会通过附加到它来改变目标正确!
  • 没有中断的情况不会重新评估下一个情况是否相等,而只是无条件地运行该块......非常感谢你,Bergi!
【解决方案2】:

你应该看看扩展运算符:

var records = [...recentlyCompleted, ...upcomingActivities, ..decisionsRequired]

您的recordsrecords2 也总是相同的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-10
    • 1970-01-01
    • 2016-10-03
    • 1970-01-01
    • 1970-01-01
    • 2013-10-14
    • 2020-11-17
    相关资源
    最近更新 更多