不同开关情况之间共享脚本

时间:2017-03-28 11:21:24

标签: javascript

条件1应执行任务1,2,3,4,5和9。 条件2应执行任务1,2,3,6,7和9。 条件3应执行任务8和9。

以下内容易于阅读,但由于先前的condition1导致脚本退出switch语句,因此不会执行第二个condition2break任务,因此无效。

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语句最简洁的方法是什么?

5 个答案:

答案 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;
&#13;
&#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)

你可以在一个物体内移动你的条件

&#13;
&#13;
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;
&#13;
&#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');