为了提高代码性能... ESLint 报告“箭头函数的复杂度为 21。允许的最大值为 20”

Man*_*Ala 3 javascript performance cyclomatic-complexity eslint

ESLint 报告了难以忍受的高复杂性。我想知道为什么它太复杂了?如果我把它分成多个函数会发生什么——这样性能好吗?据我所知,我们总是必须编写精简的代码,因此如果我们将其拆分为多个函数,它将消耗更多的空间(位)和更多的执行时间?
处理这个片段的最佳实践是什么?

const getWeekType = (f, d, e) => {
  const y = moment(),
    a = moment(f),
    i = moment(d);
  if (d && f && i.diff(a, 'days') <= 8 && y.diff(a, 'days') < 8 && y.diff(a, 'days') >= 0) {
    return { weekNum: 0, dayNum: y.diff(a, 'days') };
  }
  if (f && y.diff(a, 'days') >= 0 && y.diff(a, 'days') < 8 && (!d || i.diff(a, 'days') > 8)) {
    return { weekNum: 1, dayNum: y.diff(a, 'days') };
  }
  if (d && !f && i.diff(y, 'days') >= 0 && i.diff(y, 'days') < 8) {
    return { weekNum: 2, dayNum: 6 - i.diff(y, 'days') };
  }
  if ((!f || y.diff(a, 'days') > 8) && (!d || i.diff(y, 'days') > 8)) {
    let d = y.diff(f ? a : moment(e), 'days');
    for (; d > 7; ) d -= 7;
    return { weekNum: 3, dayNum: d };
  }
};
Run Code Online (Sandbox Code Playgroud)

tri*_*cot 6

两个问题:

  • 变量名没有意义
  • diff重复多次调用

我真的不知道代码应该做什么,但这里是它的草图

const getWeekType = (start, end, alternative) => {
  const now = moment(),
    startMoment = moment(start),
    endMoment = moment(end),
    days = endMoment.diff(startMoment, 'days'),
    daysPast = now.diff(startMoment, 'days'),
    daysFuture = endMoment.diff(now, 'days');
        
  if (end && start && days <= 8 && daysPast >= 0 && daysPast < 8) {
    return { weekNum: 0, dayNum: daysPast };
  }
  if (start && daysPast >= 0 && daysPast < 8 && (!end || days > 8)) {
    return { weekNum: 1, dayNum: daysPast };
  }
  if (end && !start && daysFuture >= 0 && daysFuture < 8) {
    return { weekNum: 2, dayNum: 6 - daysFuture };
  }
  if ((!start || daysPast > 8) && (!end || daysFuture > 8)) {
    let dayNum = start ? daysPast : now.diff(moment(alternative), 'days');
    return { weekNum: 3, dayNum: dayNum % 7 };
  }
};
Run Code Online (Sandbox Code Playgroud)