为什么我的带有 switch(true) 和 Array.concat() 的代码不能正常工作
Why my code with switch(true) and Array.concat() doesn't work properly
//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);
}
没有 break
的 case
不会重新评估下一个 case
是否相等,而只是无条件地运行块 - 称为 fallthrough。我怀疑这是你想要的。使用多个连续的 if
语句(而不是 if-else
链)——或者如果您不关心日志语句,则直接使用 records2
方法。
其次,concat
创建一个新数组,它不会通过附加到它来改变目标。有关各种解决方案,请参阅 How to append something to an array? or How to extend an existing JavaScript array with another array, without creating a new array。
你应该看看差价运算符:
var records = [...recentlyCompleted, ...upcomingActivities, ..decisionsRequired]
此外,您的 records
和 records2
将始终相同。
//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);
}
没有 break
的 case
不会重新评估下一个 case
是否相等,而只是无条件地运行块 - 称为 fallthrough。我怀疑这是你想要的。使用多个连续的 if
语句(而不是 if-else
链)——或者如果您不关心日志语句,则直接使用 records2
方法。
其次,concat
创建一个新数组,它不会通过附加到它来改变目标。有关各种解决方案,请参阅 How to append something to an array? or How to extend an existing JavaScript array with another array, without creating a new array。
你应该看看差价运算符:
var records = [...recentlyCompleted, ...upcomingActivities, ..decisionsRequired]
此外,您的 records
和 records2
将始终相同。