ESLint reports an intolerably high complexity. I want to know why is it too complex? And what happens if I just split it into multiple functions - is that performant? As I know we always have to write minified code so if we split it into multiple functions it will consume more space (bits) and more execution time?
And what is the best practice to deal with this snippet.
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 };
}
};
Two issues:
diff
are repeatedI don't really have an idea what the code is supposed to do, but here is a sketch of what it could look like:
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 };
}
};