必须表达包含两个逻辑运算符(|| 和 &&)的复杂条件的 switch 语句看起来如何?
How would a switch statement look like which has to express a complex condition that contains both logical operators (|| and &&)?
我必须根据 一个 或 两个 值构建一个条件。
const getLabel = (type?: string, typeXy?: string) => {
let label;
switch (type || typeXy) {
case 'Value A':
label = 'Label A';
break;
case 'Value B':
label = 'Label B';
break;
case 'Value C':
case 'Value X':
label = 'Label C + X';
break;
case 'Value Y':
label = 'Label C + Y';
break;
default:
break;
}
return label;
};
我需要在两个地方安装双壳。当我在 case 'Value Y':
上方添加 case 'Value C':
时,我得到:
Duplicate case label.eslintno-duplicate-case
1) 我添加了 // eslint-disable-next-line no-duplicate-case
但我的代码还不能正常工作。还是有更清洁的方法?
2) 我可以将开关从 or
更改为 and
: (type || typeXy)
但第一种情况不是在职的?如何同时支持 or
和 and
?
如何使用对象文字作为查找 table 可以精确表达的地方,哪种情况下人们更喜欢哪种结果?..
const getLabel = (type/*?: string*/, typeXy/*?: string*/) => {
return ({
'Value A': 'Label A',
'Value B': 'Label B',
'Value C': 'Label C',
'Value X': 'Label X',
'Value Y': 'Label Y',
'Value CValue X': 'Label C + X',
'Value XValue C': 'Label C + X',
'Value CValue Y': 'Label C + Y',
'Value YValue C': 'Label C + Y',
})[(type ?? '') + (typeXy ?? '')];
};
console.log("getLabel('Value A') ...", getLabel('Value A'));
console.log("getLabel('Value B', null) ...", getLabel('Value B', null));
console.log("getLabel(null, 'Value C') ...", getLabel(null, 'Value C'));
console.log("getLabel(undefined, 'Value X') ...", getLabel(undefined, 'Value X'));
console.log("getLabel('Value Y') ...", getLabel('Value Y'));
console.log("getLabel('Value C', 'Value X') ...", getLabel('Value C', 'Value X'));
console.log("getLabel('Value X', 'Value C') ...", getLabel('Value X', 'Value C'));
console.log("getLabel('Value C', 'Value Y') ...", getLabel('Value C', 'Value Y'));
console.log("getLabel('Value Y', 'Value C') ...", getLabel('Value Y', 'Value C'));
.as-console-wrapper { min-height: 100%!important; top: 0; }
如果我理解你的问题,你想有条件地检查是否传递了两个参数,如果传递了,则使用逻辑 AND 比较,否则如果只传递一个或另一个,则恢复为逻辑 OR 比较。
使用外部开关在逻辑 AND/OR 条件上分支,然后使用嵌套开关计算特定的 AND 或 OR 组合。
const getLabel = (type /*?: string*/, typeXy /*?: string*/) => {
switch (true) {
case !!(type && typeXy):
switch (type) {
case "Value C": {
let label = "Label C";
switch (typeXy) {
case "Value X":
return label + " + X";
case "Value Y":
return label + " + Y";
}
}
}
break;
case !!(type || typeXy):
switch (type || typeXy) {
case "Value A":
return "Label A";
case "Value B":
return "Label B";
}
}
};
console.log(getLabel("Value A")); // Label A
console.log(getLabel("Value B")); // Label B
console.log(getLabel(undefined, "Value A")); // Label A
console.log(getLabel(undefined, "Value B")); // Label B
console.log(getLabel("Value C", "Value X")); // Label C + X
console.log(getLabel("Value C", "Value Y")); // Label C + Y
我必须根据 一个 或 两个 值构建一个条件。
const getLabel = (type?: string, typeXy?: string) => {
let label;
switch (type || typeXy) {
case 'Value A':
label = 'Label A';
break;
case 'Value B':
label = 'Label B';
break;
case 'Value C':
case 'Value X':
label = 'Label C + X';
break;
case 'Value Y':
label = 'Label C + Y';
break;
default:
break;
}
return label;
};
我需要在两个地方安装双壳。当我在 case 'Value Y':
上方添加 case 'Value C':
时,我得到:
Duplicate case label.eslintno-duplicate-case
1) 我添加了 // eslint-disable-next-line no-duplicate-case
但我的代码还不能正常工作。还是有更清洁的方法?
2) 我可以将开关从 or
更改为 and
: (type || typeXy)
但第一种情况不是在职的?如何同时支持 or
和 and
?
如何使用对象文字作为查找 table 可以精确表达的地方,哪种情况下人们更喜欢哪种结果?..
const getLabel = (type/*?: string*/, typeXy/*?: string*/) => {
return ({
'Value A': 'Label A',
'Value B': 'Label B',
'Value C': 'Label C',
'Value X': 'Label X',
'Value Y': 'Label Y',
'Value CValue X': 'Label C + X',
'Value XValue C': 'Label C + X',
'Value CValue Y': 'Label C + Y',
'Value YValue C': 'Label C + Y',
})[(type ?? '') + (typeXy ?? '')];
};
console.log("getLabel('Value A') ...", getLabel('Value A'));
console.log("getLabel('Value B', null) ...", getLabel('Value B', null));
console.log("getLabel(null, 'Value C') ...", getLabel(null, 'Value C'));
console.log("getLabel(undefined, 'Value X') ...", getLabel(undefined, 'Value X'));
console.log("getLabel('Value Y') ...", getLabel('Value Y'));
console.log("getLabel('Value C', 'Value X') ...", getLabel('Value C', 'Value X'));
console.log("getLabel('Value X', 'Value C') ...", getLabel('Value X', 'Value C'));
console.log("getLabel('Value C', 'Value Y') ...", getLabel('Value C', 'Value Y'));
console.log("getLabel('Value Y', 'Value C') ...", getLabel('Value Y', 'Value C'));
.as-console-wrapper { min-height: 100%!important; top: 0; }
如果我理解你的问题,你想有条件地检查是否传递了两个参数,如果传递了,则使用逻辑 AND 比较,否则如果只传递一个或另一个,则恢复为逻辑 OR 比较。
使用外部开关在逻辑 AND/OR 条件上分支,然后使用嵌套开关计算特定的 AND 或 OR 组合。
const getLabel = (type /*?: string*/, typeXy /*?: string*/) => {
switch (true) {
case !!(type && typeXy):
switch (type) {
case "Value C": {
let label = "Label C";
switch (typeXy) {
case "Value X":
return label + " + X";
case "Value Y":
return label + " + Y";
}
}
}
break;
case !!(type || typeXy):
switch (type || typeXy) {
case "Value A":
return "Label A";
case "Value B":
return "Label B";
}
}
};
console.log(getLabel("Value A")); // Label A
console.log(getLabel("Value B")); // Label B
console.log(getLabel(undefined, "Value A")); // Label A
console.log(getLabel(undefined, "Value B")); // Label B
console.log(getLabel("Value C", "Value X")); // Label C + X
console.log(getLabel("Value C", "Value Y")); // Label C + Y