以下代码如何简写?

AB各有两种状态 TRUE 和 FALSE
排列组合一共有四种可能
根据四种可能给flag赋不同值

最原始的代码就是

if( A && !B){flag = xxx}
if( A && B){flag = xxx}
if(!A && B){flag = xxx}
if(!B && !A){flag = xxx}

请问有什么简写方法吗

阅读 2.1k
6 个回答

个人觉得最清晰的是if嵌套

if(A){
    flag = B ? '1' : '2'
}else{
    flag = B ? '3' : '4'
}

不考虑可读性就直接一行flag = A ? B ? '1' : '2' : B ? '3': '4'

甚至二进制玩法flag = ['4', '3', '2', '1'][A << 1 + B]

没什么好简化的了

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 getFlag(a, b) {
  if (a) {
    return b ? '1' : '2'
  }

  return b ? '3' : '4'
}

我来提供一个不同的思路吧。

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
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题