【问题标题】:If statement vs Switch statementIf 语句与 Switch 语句
【发布时间】:2020-09-18 12:42:00
【问题描述】:

我已经在我的代码中尝试了 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;
     }

【问题讨论】:

  • case 中删除query.order == ... 所以case 'name_asc' 等 - 这里有一些documentation 来学习如何使用开关
  • 谢谢,试过 case == 'name_asc': 首先。现在我知道如何正确使用它了:)
  • case == 'name_asc' 不,那也是错的,应该和我说的一样,不是你编的
  • 大声笑我知道。我只是说我试过了xD

标签: javascript if-statement switch-statement


【解决方案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;
     }

但是,我建议使用 Object 将条目值映射到结果。这当然取决于你。

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
    }
    

    所以你应该从你的case 中删除query.order ==例如

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

    【讨论】: