条件1应执行任务1,2,3,4,5和9。 条件2应执行任务1,2,3,6,7和9。 条件3应执行任务8和9。
以下内容易于阅读,但由于先前的condition1
导致脚本退出switch语句,因此不会执行第二个condition2
和break
任务,因此无效。
var condition='condition1';
switch(condition) {
case 'condition1':
case 'condition2':
console.log('do task 1');
console.log('do task 2');
console.log('do task 3');
break;
case 'condition1':
console.log('do task 4');
console.log('do task 5');
break;
case 'condition2':
console.log('do task 6');
console.log('do task 7');
break;
case 'condition3':
console.log('do task 8');
break;
}
console.log('do task 9');
以下内容应该可行,但它不易阅读,并且随着不同条件之间共享更多功能而变得越来越困难。
var condition='condition1';
switch(condition) {
case 'condition1':
case 'condition2':
console.log('do task 1');
console.log('do task 2');
console.log('do task 3');
switch(condition) {
case 'condition1':
console.log('do task 4');
console.log('do task 5');
break;
case 'condition2':
console.log('do task 6');
console.log('do task 7');
break;
}
break;
case 'condition3':
console.log('do task 8');
break;
}
console.log('do task 9');
同样,这应该有效,但是为不同的组提出描述性名称将会有问题。
var condition='condition1';
switch(condition) {
case 'condition1':
task_group_1_2_3();
task_group_4_5();
break;
case 'condition2':
task_group_1_2_3();
task_group_6_7();
break;
case 'condition3':
console.log('do task 8');
break;
}
console.log('do task 9');
function task_group_1_2_3() {
console.log('do task 1');
console.log('do task 2');
console.log('do task 3');
}
function task_group_4_5() {
console.log('do task 4');
console.log('do task 5');
}
function task_group_6_7() {
console.log('do task 6');
console.log('do task 7');
}
创建一个在不同情况条件之间共享一些脚本的switch语句最简洁的方法是什么?
答案 0 :(得分:1)
您可以将条件移动到对象和任务中,并使用任务迭代数组。
您可以使用正确的名称而不是数字作为键名。
var tasks = {
1: function () { console.log(1); },
2: function () { console.log(2); },
3: function () { console.log(3); },
4: function () { console.log(4); },
5: function () { console.log(5); },
6: function () { console.log(6); },
7: function () { console.log(7); },
8: function () { console.log(8); },
9: function () { console.log(9); }
},
conditions = {
1: [1, 2, 3, 4, 5, 9],
2: [1, 2, 3, 6, 7, 9],
3: [8, 9]
},
condition = 1;
conditions[condition].forEach(function (a) { tasks[a](); });
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 1 :(得分:1)
由于多个条件可以调用单个任务,因此最好实现条件到任务的映射并扫描它。
这样,您可以轻松添加/删除条件并添加/删除任务。
function task1() { console.log("Task 1."); }
function task2() { console.log("Task 2."); }
function task3() { console.log("Task 3."); }
function task4() { console.log("Task 4."); }
function task5() { console.log("Task 5."); }
function task6() { console.log("Task 6."); }
function task7() { console.log("Task 7."); }
function task8() { console.log("Task 8."); }
function task9() { console.log("Task 9."); }
var conditionTaskMapping = {
"condition1": [task1, task2, task3, task4, task5, task9],
"condition2": [task1, task2, task3, task6, task7],
"condition3": [task8, task9]
};
document.querySelector("button").onclick = function() {
var condition = document.querySelector("input").value;
if (!conditionTaskMapping[condition])
{
console.log("Unknown condition: " + condition);
return;
}
for (var task of conditionTaskMapping[condition])
{
task();
}
};

<input type="text" value="condition1"/>
<button>Go</button>
&#13;
答案 2 :(得分:0)
我认为不推荐嵌套开关(开关2)。
所以,我发现你的第一个开关比其他开关更具可读性
也许你可以把它分成两个开关。
var condition='condition1';
switch(condition) {
case 'condition1':
case 'condition2':
console.log('do task 1');
console.log('do task 2');
console.log('do task 3');
break;
}
switch(condition) {
case 'condition1':
console.log('do task 4');
console.log('do task 5');
break;
case 'condition2':
console.log('do task 6');
console.log('do task 7');
break;
case 'condition3':
console.log('do task 8');
break;
}
console.log('do task 9');
答案 3 :(得分:0)
你可以在一个物体内移动你的条件
const conditions = {
"condition1" : {
"foo": ()=>console.log('do task 1'),
"foo2": ()=>console.log('do task 2'),
"foo3": ()=>console.log('do task 3'),
"foo4": ()=>console.log('do task 4'),
"foo5": ()=>console.log('do task 5'),
"foo6": ()=>console.log('do task 9')
},
"condition2": {
"foo": ()=>console.log('do task 1'),
"foo2": ()=>console.log('do task 2'),
"foo3": ()=>console.log('do task 3'),
"foo4": ()=>console.log('do task 6'),
"foo5": ()=>console.log('do task 7'),
"foo6": ()=>console.log('do task 9')
},
"condition3": {
"foo": ()=>console.log('do task 8'),
"foo2": ()=>console.log('do task 9')
}
};
Object.values(conditions['condition1']).forEach(f=>f());
&#13;
答案 4 :(得分:0)
为了好玩,因为这是一个美容困境:)
function f(sCond, iTask) {
// matrix of dependencies
var m = {
'condition1' : [1, 2, 3, 4, 5, 9],
'condition2' : [1, 2, 3, 6, 7, 9],
'condition3' : [8, 9]
};
return m[sCond].indexOf(iTask) !== -1;
};
f(condition, 1) && console.log('do task1');
f(condition, 2) && console.log('do task2');
f(condition, 3) && console.log('do task3');
f(condition, 4) && console.log('do task4');
f(condition, 5) && console.log('do task5');
f(condition, 6) && console.log('do task6');
f(condition, 7) && console.log('do task7');
f(condition, 8) && console.log('do task8');
f(condition, 9) && console.log('do task9');