将案例动态添加到交换机

IT技术 javascript jquery
2021-02-20 03:49:01

我需要动态地将案例添加到开关。我希望用户能够添加项目并且每个项目都需要它自己的开关盒。

4个回答

您可以将 object 与回调函数一起使用:

// you can have initial casses
var callbacks = {
   'something': () => 42
};

// and you can create new entry with this function
function add(_case, fn) {
   callbacks[_case] = callbacks[_case] || [];
   callbacks[_case].push(fn);
}

// this function work like switch(value)
// to make the name shorter you can name it `cond` (like in scheme)
function pseudoSwitch(value) {
   if (callbacks[value]) {
      callbacks[value].forEach(function(fn) {
          fn();
      });
   }
}

您可以使用以下方法添加新条目:

add('something', function() {
   // case for something
});

注意

您还可以修改它以使其与原始开关稍有不同,因为您可以拥有一个返回值的函数并使用类似开关的表达式(例如在 Scheme 中,一切都是一个返回值的表达式):

const value = cond(42);

编写这种类型的pseudoSwitch/cond 函数留给读者作为练习。

注 2

默认情况下,JavaScript 中的对象使用字符串作为键,如果您需要使用无法轻松转换为字符串的内容,例如对象(将被转换为[Object object]),那么您可以使用接受任何内容作为键的Map对象。请注意,符号的工作方式不同,当用作数组中的键时,它们不会转换为字符串。

这是满足我需求的最佳/更简单的解决方案:

const customSwitch = [
    {
        condition: 'case1',
        fn() { /* Do stuff if case1 */ },
    }, {
        condition: 'canBeChangedAnytime',
        fn() { /* Do stuff if case2 */ },
    },
    ...adSomeCasesDynamycallyHere,
]

// edit a condition:
customSwitch[0].condition = 'changed';

// use the switch
for (const { condition, fn } of customSwitch) {
    if (myValue === condition) {
        fn();
        break;
    }
}

customSwitch, 可能具有对象的形式,这可以提高可读性。例如:customSwitch = { myCond: { condition, fn }}

您可以单击上面的代码段以查看它是否有效;)

这需要知道数组将具有的元素数量,如果您尝试动态构建,您很可能不会知道。
2021-04-25 03:49:01
例如,您可以拥有一个包含空元素的大数组,像这样它不会是未定义的但仍然可以配置......就像用户可以动态使用的占位符(这就是我通常所做的)
2021-05-06 03:49:01
如果您走这条路线,拥有 2 个阵列(并且没有开关盒)可能会更简单。一个用于case字符串,另一个用于case函数。然后您可以找到该indexOf()字符串并从该索引处的函数数组中调用该函数。
2021-05-09 03:49:01
或者更好的是,一个对象!这就是我经常做的:{ caseA() { ...doStuff();}, caseB() {...doElse...}}但有时你只需要一个开关
2021-05-19 03:49:01

您可以Object用于开关盒。使用Object而不是Arrayfor case的优点之一是它大大减少了由Array. 使用Objectfor 案例,您还可以将案例值提取到另一个脚本中。这有助于单一职责原则,因为您只需要在 switch 案例中实现业务逻辑,而不必担心维护正确的案例值。

const OP = {
    ADD: 'ADD',
    MULTIPLY: 'MULTIPLY',
};
const choice = 'ADD';
switch (choice) {
    case OP.ADD:
        console.log('You chose add');
        break;
    case OP.MULTIPLY:
        console.log('You chose multiply');
        break;
    default:
        console.log('Operation is not defined');
}

you can create a custom switch statement as shown below,

var callbackArr = [];
function customSwitch(casestmt, callback){
     var callbackObj = {};
     callbackObj['cs'] = casestmt;
     callbackObj['clbkfn'] = callback;
     callbackArr.push(callbackObj);
}
function switchExecute(condition) {
   return callbackArr[callbackArr.findIndex(data => data.cs ===condition)].clbkfn(); 
}
jobs = [{'jobname': 'job1'},{'jobname': 'job2'}, {'jobname': 'job3'},{'jobname': 'job4'} ];
jobs.forEach((job)=> {
  customSwitch(job.jobname, ()=> {console.log(job.jobname)});
});

switchExecute(args[0]);