Оператор If против оператора Switch

#javascript #if-statement #switch-statement

#javascript #if-statement #оператор switch

Вопрос:

Я опробовал оба оператора switch и if в своем коде. Switch выглядит лучше, imo. Но у меня это не работает. Оператор if работает. Вы видите проблему? Я чувствую, что они делают то же самое. (я фильтрую список объектов)

 let sort = {};


//THE IF STATEMENT
if (query.order == 'name_asc') {
        sort = {name : 1 }
     }
     if (query.order == 'name_desc') {
         sort = { name : -1 }
     }
     if ( query.order == 'lowprice') {
         sort = { price : 1 }
     }
     if ( query.order == 'oldest' ) {
         sort = { year : 1 }
     }
     if ( query.order == 'newest' ) {
         sort = { year : -1 }
     }

// THE SWITCH STATEMENT

     switch (query.order) {
        case query.order == 'name_asc':
            sort = { name : 1 }
            console.log(1)
            break;

        case query.order == 'name_desc':
            sort = { name : -1 }
            console.log(2)
            break;

        case query.order == 'lowprice':
            sort = { price : 1 }
            console.log(3)
            break;

        case query.order == 'oldest':
            sort = { year : 1 }
            console.log(4)
            break;
     
        case query.order == 'newest':
            sort = { price : -1 }
            console.log(5)
            break;
        default: console.log(6)
        break;
     }

  

Комментарии:

1. удалить query.order == в case … итак case 'name_asc' , и т. Д. — Вот некоторая документация , чтобы узнать, как использовать switch

2. Спасибо, попробовал case == ‘name_asc’: сначала. Теперь я знаю, как правильно его использовать 🙂

3. case == 'name_asc' нет, это тоже неправильно, все должно быть так, как я сказал, а не то, что вы придумали

4. Лол, я знаю. Я только что сказал, что пробовал xD

Ответ №1:

Вы неправильно используете оператор switch query.order == 'name_asc и т. Д. вычислите логическое значение. Поэтому оператор switch пытается сравнить строку с логическим значением, что приводит к тому, что операторы case никогда не вводятся.

Правильное использование было бы

 switch (query.order) {
        case 'name_asc':
            sort = { name : 1 }
            console.log(1)
            break;

        case 'name_desc':
            sort = { name : -1 }
            console.log(2)
            break;

        case 'lowprice':
            sort = { price : 1 }
            console.log(3)
            break;

        case 'oldest':
            sort = { year : 1 }
            console.log(4)
            break;
     
        case 'newest':
            sort = { year : -1 }
            console.log(5)
            break;
        default: console.log(6)
        break;
     }
  

Однако я бы рекомендовал использовать объект для сопоставления значения ввода с результатом. Конечно, это зависит от вас.

 const NAME_ASC = 'name_asc';
const NAME_DESC = 'name_desc';
const PRICE_LOW = 'lowprice';
const PRICE_HIGH = 'highprice';
const CREATION_ASC = 'oldest';
const CREATION_DESC = 'newest';

const sortOrderMapping = {
   [NAME_ASC]: {name: 1},
   [NAME_DESC]: {name: -1},
   // fill in all the cases
}


function getSortOrderObject(orderEnum){
   // this returns undefined if orderEnum is not a valid value
   // maybe you want to return a default value, throw an error, or utilize Option monads
   return sortOrderMapping[orderEnum];
}
  

Ответ №2:

В JavaScript синтаксис switch оператора:

 switch(expression) {
  case x:
    // code block
    break;
  case y:
    // code block
    break;
  default:
    // code block
}
  

Поэтому вы должны удалить query.order == из своего case , например:

 function get_sort(query_order) {
  switch (query_order) {
    case 'name_asc': return {name: 1};
    case 'name_desc': return {name: -1};
    case 'lowprice': return {price: 1};
    case 'oldest': return {year: 1};
    case 'newest': return {year: -1};
  }
}
['name_asc', 'name_desc', 'lowprice', 'oldest', 'newest'].forEach(query_order => {
  console.log(get_sort(query_order));
});