Shorthand JS条件

Shorthand JS Condition

对于这种 shorthand 情况,我需要一些帮助。到目前为止,我对它的尝试变得有点挑战,而且似乎无法使其更具可读性。我相信它被缩小短路了。

  if (a === !0 || perSearch.rates.fy2) {
    e();
  } else if ( perSearch.rates.fy1.multiple || perSearch.rates.fy2.multiple ){
    calculateRates();
  } else {
    perSearch.rates.fy1.multiple;
  }

来自这个简洁的表达式:

a === !0 || (perSearch.rates.fy2 ? perSearch.rates.fy1.multiple || perSearch.rates.fy2.multiple ? e() : calculateRates() : perSearch.rates.fy1.multiple ? e() : calculateRates())

你的表情对应

if (a === !0) {
} else {
    if (perSearch.rates.fy2) {
        if (perSearch.rates.fy1.multiple || perSearch.rates.fy2.multiple) {
            e();
        } else {
            calculateRates();
        }
    } else {
        if (perSearch.rates.fy1.multiple) {
            e();
        } else {
            calculateRates();
        }
    }
}

可以简化为

if (a !== true) {
    if (perSearch.rates.fy1.multiple || (perSearch.rates.fy2 && perSearch.rates.fy2.multiple)) {
        e();
    } else {
        calculateRates();
    }
}

应该是这样的:

if (a !== false) {
    if (perSearch.rates.fy2) {
        if (!perSearch.rates.fy1.multiple) {
            if (perSearch.rates.fy2.multiple) {
                e()
            }
            else {
                calculateRates()
            }
        }
    }
    else {
        if (perSearch.rates.fy1.multiple) {
            e()
        }
        else {
            calculateRates()
        }
    }
}

这是某种 return(return 一个 || 结果),还是一个大条件(a 为真或其他代码求值为真)?无论哪种方式,我都倾向于分阶段对其进行攻击,块代码,然后抽象,重复直到代码看起来易于管理。

阻止

屏蔽条件语句以使其更易于阅读。

(
  a === !0 
  || (
    perSearch.rates.fy2 
      ? (perSearch.rates.fy1.multiple || (perSearch.rates.fy2.multiple ? e() : calculateRates())) 
      : (perSearch.rates.fy1.multiple ? e()   : calculateRates())
  )
)

摘要

抽象出一些大而简单的逻辑重复。

const x = rates => ( (rates) ? e() : calculateRates() );

(
  a === true || (perSearch.rates.fy2)
    ? ((perSearch.rates.fy1.multiple) || x(perSearch.rates.fy2.multiple))
    : x(perSearch.rates.fy1.multiple)
)

继续

编写代码以分离出条件。

const calc = rates => ((rates) ? e() : calculateRates());
const compare = rates => {
  let fy1 = (rates.hasOwnProperty('fy1')) ? rates.fy1 : false;
  let fy2 = (rates.hasOwnProperty('fy2')) ? rates.fy2 : false;

  if (fy2) {
    if (fy1.multiple) {
      return fy1.multiple;
    } 
    return calc(fy2.multiple);
  } else {
    return calc(fy1.multiple);
  }
}

a === true || compare(perSearch.rates); 

编辑(更多继续!)

再看一遍我认为它会受益于一些早期的 returns。

看条件化简。

  • 如果 fy2 和如果 fy1.multiple {return fy1.multiple}
  • 如果不是fy2 {return fy1.multiple}
  • 如果 fy2 而不是 fy1.multiple {return fy2.multiple}

    const calc = rates => ((rates) ? e() : calculateRates());
    const compare = rates => {
      let fy1 = (rates.hasOwnProperty('fy1')) ? rates.fy1 : false;
      let fy2 = (rates.hasOwnProperty('fy2')) ? rates.fy2 : false;
    
      // consolidate conditions leading to same place.
      if (!fy2 || (fy2 && fy1 && fy1.multiple)) {
        return calc(fy1.multiple);
      } 
      return calc(fy2.multiple);
    }
    
    a === true || compare(perSearch.rates);