速记JS条件

时间:2017-08-29 18:27:50

标签: javascript short-circuiting

我需要一点这种速记条件的帮助。到目前为止,我对它的尝试变得有点挑战,似乎无法让它更具可读性。我相信这是在缩小时的短路。

  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())

3 个答案:

答案 0 :(得分:1)

您的表达式对应

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();
    }
}

答案 1 :(得分:1)

应该是这样:

Get-Content z:\csv\input_file.csv -ReadCount 900 | %{$_[0]} | Set-Content z:\csv\output_file.csv

答案 2 :(得分:1)

这是某种返回(返回||结果),还是大条件(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); 

编辑(更多继续!)

再看一遍,我认为它会从早期的回报中受益。

看看有条件的简化。

  • 如果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);