Можно ли сделать так, что если конструкция switch нашла подходящее значение, то конструкция if выполняться не будет?

let comparison = (firstDate, secondDate) => {
  const da1 = firstDate.split('.');
  let fDate = new Date(Number(da1[2]), Number(da1[1] - 1), Number(da1[0]));
  const da2 = secondDate.split('.');
  let sDate = new Date(Number(da2[2]), Number(da2[1] - 1), Number(da2[0]));
  let diffs = Math.floor(sDate - fDate) / (1000 * 3600 * 24);

  switch (diffs) {
    case 2:
      console.log('2 дня назад');
      break;

    case 0:
      console.log('несколько часов назад');
      break;

    case 7:
      console.log('неделю назад');
      break;

    case 1:
      console.log('день назад');
      break;

    case 3:
      console.log('3 дня назад');
      break;

    case 4:
      console.log('4 дня назад');
      break;

    case 5:
      console.log('5 дней назад');
      break;

    case 6:
      console.log('6 дней назад');
      break;

    case 8:
    case 9:
    case 10:
      console.log('более недели назад');
      break;
  }

  if (diffs > 365) {
    console.log('несколько лет назад');
  } else if (diffs < 0) {
    console.log('в скором будущем');
  } else if (diffs == 365) {
    console.log('год назад');
  } else if (diffs < 30 && diffs > 10) {
    console.log('менее месяца назад');
  } else if (diffs === 30 || diffs === 31) {
    console.log('месяц назад');
  } else if (diffs > 31 & diffs < 60) {
    console.log('более одного месяца назад');
  } else {
    console.log('несколько месяцев назад');
  }
}

console.log(comparison('10.02.2004', '06.01.2015'));
console.log(comparison('10.02.2024', '10.04.2023'));
console.log(comparison('03.06.2023', '06.06.2023'));


Ответы (4 шт):

Автор решения: teran

замените break на return

function test(diffs) {
  switch (diffs) {
    case 0:
      return 'несколько часов назад';
    case 1:
      return 'день назад';
    case 2:
    case 3:
    case 4:
      return `${diffs} дня назад`;      
    case 5:
    case 6:
      return `${diffs} дней назад`;
    case 7:
      return 'неделю назад';      
    case 8:
    case 9:
    case 10:
      return 'более недели назад';      
    case 30:
    case 31:
      return 'месяц назад'
    case 365:
      return 'год назад';
  }

  if (diffs < 0) {
    return 'в скором будущем';
  } else if (diffs > 10 && diffs < 30) {
    return 'менее месяца назад';  
  } else if (diffs > 31 && diffs < 60) {
    return 'более одного месяца назад';
  } else if (diffs < 365) {
     return 'несколько месяцев назад';  
  }
  return 'несколько лет назад';
}

$("#check").click(function(){
  let d = $("#diff").val();
  console.log(test(+d));
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input id="diff"><button id="check">check</button>

→ Ссылка
Автор решения: zane

Попробуй написать ветку if в default:

function test(diffs) {
      switch (diffs) {
        case 0:
          return 'несколько часов назад';
        case 1:
          return 'день назад';
        case 2:
        case 3:
        case 4:
          return `${diffs} дня назад`;      
        case 5:
        case 6:
          return `${diffs} дней назад`;
        case 7:
          return 'неделю назад';      
        case 8:
        case 9:
        case 10:
          return 'более недели назад';      
        case 30:
        case 31:
          return 'месяц назад'
        case 365:
          return 'год назад';
        default:
          if (diffs > 365) {
            return 'несколько лет назад';
          } else if (diffs < 0) {
            return 'в скором будущем';
          } else if (diffs < 30 && diffs > 10) {
            return 'менее месяца назад';  
          } else if (diffs > 31 && diffs < 60) {
            return 'более одного месяца назад';
         } else {
             return 'несколько месяцев назад';  
         }
    }
 }
        
$("#check").click(function(){
  let d = $("#diff").val();
  console.log(test(+d));
});

P.s.
случайно я взял чужое решение которое к слову должно работать

→ Ссылка
Автор решения: puffleeck

решил таки объединить комментарии в ответ.


при таком "громоздком" и "разнообразном" содержимом кейсов, свич тут вообще не нужен.

то что <8 можно загнать в массив, типа var x = [сегодня, вчера, 2дня, 3дня...]

после if(diffs<7) console.log(x[diffs]); и 8-10 схлопнуть в еще один if.

впрочем можно и еще изящней...

заменить ifы тернарником и тогда все это безобразие спокойно обернётся одним единственным console.log(ну или функцией) вместо их кучи на разных ветках.

var ruTimes = // мульти-язык надо? :3
['несколько часов назад',
'1 день назад',
'2 дня назад',
'3 дня назад',
'4 дня назад',
'5 дней назад',
'6 дней назад',
'неделю назад',
'более недели назад',
'менее месяца назад',
'месяц назад',
'более месяца назад',
'несколько месяцев назад',
'менее полугода',
'более полугода',
'год назад',
'больше года назад',
'несколько лет назад',
'в скором будущем'];
function myTimes(x, d){var y =
d >= 0 && d < 8 ? x[d]:
d >= 8 && d < 14 ? x[8]:
d >= 14 && d < 28 ? x[9]:
d >= 28 && d < 32? x[10]: // февраль тоже месяц
d >= 32 && d < 63 ? x[11]:
d >= 63 && d < 94 ? x[12]:
d >= 94 && d < 183 ? x[13]:
d >= 183 && d < 365 ? x[14]:
d == 365 ? x[15]:
d > 365 && d < 365*2 ? x[16]:
d >= 365*2 ? x[17]:
d <= 0 ? x[18]: 'error'; return y;} //зато сниппет без скролла :3
<input type='number' placeholder='развлекайтесь ;)'
onchange='console.log(myTimes(ruTimes, this.value));'>

p.s. если производительности не жалко, можно в принципе массив и рекурсией\циклом прощупать, так еще компактнее выйдет :3

→ Ссылка
Автор решения: niknils

М-да.. если Вы так написали, веря в то, что это "читабельный код", то Ваша вера также логична, как оправданно существование "Windows Home" и "Windows Pro" с точки зрения ОС, а не коммерции.

Теперь немного шуточного кода касательно "дописывания" comparison().

//чем стрелочная функция лучше function-объвления? отсутствием переменной arguments, конечно! теперь мы не сможем проверить количество аргументов и сделать неявный парсинг arguments[] с подстановкой текущей даты без переменной в параметрах функции, эх! как хорошо живём! новые технологии!

//bad codding (c) -> public vars ?? why??? why let????
let comparison = (firstDate, secondDate) => {
    const da1 = firstDate.split('.');
    let fDate = new Date(Number(da1[2]), Number(da1[1] - 1), Number(da1[0]));
    const da2 = secondDate.split('.');
    let sDate = new Date(Number(da2[2]), Number(da2[1] - 1), Number(da2[0]));
    let diffs = Math.floor(sDate - fDate) / (1000 * 3600 * 24);

    //может быть 'return' вместо 'console.log'?
    console.log((function(_Idiff) {
        switch (_Idiff) {
        case 2:
          return '2 дня назад';
        case 0:
          return 'несколько часов назад';
        case 7:
          return 'неделю назад';
        case 1:
          return 'день назад';
        case 3:
          return '3 дня назад';
        case 4:
          return '4 дня назад';
        case 5:
          return '5 дней назад';
        case 6:
          return '6 дней назад';
        case 8:
        case 9:
        case 10:
          return 'более недели назад';
        default:
          if (diffs > 365) {
            return 'несколько лет назад';
          } else if (_Idiff< 0) {
            return 'в скором будущем';
          } else if (_Idiff== 365) {
            return 'год назад';
          } else if (_Idiff< 30 && _Idiff> 10) {
            return 'менее месяца назад';
          } else if (_Idiff=== 30 || _Idiff=== 31) { //omg... '==='... omg... secure for Object.assign(primitiveForExampleNumberType, {someObject}) ?? after date calc... omg
            return 'месяц назад';
          } else if (_Idiff> 31 & _Idiff< 60) {
            return 'более одного месяца назад';
          } else {
            return 'несколько месяцев назад';
          }
        }
    })(diffs)); //хотя зачем _Idiff когда let? внутри кода, смысле
}
//более того, зачем console.log по второму кругу? может реально return?
console.log(comparison('10.02.2004', '06.01.2015'));
console.log(comparison('10.02.2024', '10.04.2023'));
console.log(comparison('03.06.2023', '06.06.2023'));
//также рекомендую загуглить ISO 8601 или сделать проверку локализации Date и попытку получения указанного формата и парсинг; де-факто ISO + этот, как бы, русский формат даты + локализация формата, идущая в приоритете; какой-то совсем не универсальный код с мусорными фрагментами вида const и let
//я думаю, что именно после таких людей и появляются const и TypeScript; ну правда, сделайте для приличия проверку типа даты

→ Ссылка