AB各有两种状态 TRUE 和 FALSE
排列组合一共有四种可能
根据四种可能给flag赋不同值
最原始的代码就是
if( A && !B){flag = xxx}
if( A && B){flag = xxx}
if(!A && B){flag = xxx}
if(!B && !A){flag = xxx}
请问有什么简写方法吗
没什么好简化的了
if (A) {
flag = B ? '1' : '2'
} else {
flag = B ? '3' : '4'
}
如果非要看起来简洁一点,只能这样
const _map = {
'11': 'a',
'10': 'b',
'01': 'c',
'00': 'd'
}
flag = _map[`${+A}${+B}`]
按照我编码的惯例,if中的条件,如果是2个及以上的话,我会考虑给条件命名,使之具有语义化;
let stateA = (A,B) =>{}
let stateB= (A,B) =>{}
let stateC= (A,B) =>{}
let stateD= (A,B) =>{}
再进一步,考虑使用对象
const map = {
[stateA]: result1,
[stateB]: result2,
[stateC]: result3,
[stateD]: result4,
}
结果
const result = map[fn(A,B)]
如果result本身也是函数的话,
const result = map[fn(A,B)]()
代码量好像上来了,但是更具备可读性,语义性,拓展的话也不乱;
仅仅多提供一种思路作为参考,希望能有所帮助
试试这么写
const { flag } = ([
{ condition: A && B, flag: xxx },
{ condition: A && !B, flag: xxx },
{ condition: !A && B, flag: xxx },
{ condition: !B && !A, flag: xxx }
].find(({ condition }) => condition) || { flag: 'default' })
我来提供一个不同的思路吧。
function fn(A, B) {
let n = 0;
if (A) n += 1;
if (B) n += 2;
return n;
}
fn(false, false); // 0
fn(true, false); // 1
fn(false, true); // 2
fn(true, true); // 3
这样处理之后,你就可以把所有可能的flag放到一个数组里
const flags = [
'A false,B false',
'A true,B false',
'A false,B true',
'A true,B true',
]
这种代码比较好扩展,比如你现在又来了个C
function fn(A, B, C) {
let n = 0;
if (A) n += 1;
if (B) n += 2;
if (C) n += 4;
return n;
}
fn(false, false, false); // 0
fn(true, false, false); // 1
fn(false, true, false); // 2
fn(true, true, false); // 3
fn(false, false, true); // 4
fn(true, false, true); // 5
fn(false, true, true); // 6
fn(true, true, true); // 7
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
3 回答5.1k 阅读✓ 已解决
3 回答1.8k 阅读✓ 已解决
个人觉得最清晰的是if嵌套
不考虑可读性就直接一行
flag = A ? B ? '1' : '2' : B ? '3': '4'
甚至二进制玩法
flag = ['4', '3', '2', '1'][A << 1 + B]