我需要动态地将案例添加到开关。我希望用户能够添加项目并且每个项目都需要它自己的开关盒。
将案例动态添加到交换机
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 }}
您可以单击上面的代码段以查看它是否有效;)
您可以Object
用于开关盒。使用Object
而不是Array
for case的优点之一是它大大减少了由Array
. 使用Object
for 案例,您还可以将案例值提取到另一个脚本中。这有助于单一职责原则,因为您只需要在 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]);
其它你可能感兴趣的问题