【问题标题】:Change if else to switch case statement更改 if else 以切换 case 语句
【发布时间】:2021-06-30 01:44:45
【问题描述】:

我有一个函数,有一些 if...else 像这样:

function updateInputs(data) {
  from = data.from;
  to = data.to;
  rangeInput = $(data.input);
  
  if (rangeInput.hasClass('rangeSalary')) {
    $inputFromSalary.prop("value", from);
    $inputToSalary.prop("value", to);      
  } else if (rangeInput.hasClass('rangeAge')) {
    $inputFromAge.prop("value", from);
    $inputToAge.prop("value", to);
  }
  
  table.draw();
}

但是我需要添加更多的语句,所以我认为最好使用switch…case,所以我尝试这样做:

function updateInputs(data) {
  from = data.from;
  to = data.to;
  rangeInput = $(data.input).hasClass('rangeSalary');

  switch (rangeInput) {
    case 'rangeSalary':
      $inputFromSalary.prop("value", from);
      $inputToSalary.prop("value", to);
      break;
    case 'rangeAge':
      $inputFromAge.prop("value", from);
      $inputToAge.prop("value", to);
      break;
  }

  table.draw();
}

但它没有用。我错过了什么?

【问题讨论】:

  • 1. .hasClass() 返回一个布尔值 2。rangeInput 总是只会告诉你 data.input 是否有 rangeSalary 类。
  • “但我需要添加更多语句” - 它们总是采用相同的格式吗?该类由两部分组成,前缀range 和字段的“类型”(Salary,Age,...)?并且必须修改的字段始终具有前缀$inputFrom 和$inputTo + 字段的“类型”(Salary,Age,...)?它们总是全局变量还是这些字段最终是如何出现在这些变量中的? -> minimal reproducible example
  • 是的,它们总是采用相同的格式,它们非常相似并且总是有这个前缀。

标签: jquery if-statement switch-statement break


【解决方案1】:

您的代码的问题是您从hasClass 获得的结果将是true 或false,两者都不匹配您的任何案例标签。

如果注意到if/else if 块(或cases)中的代码唯一不同的是您调用prop 的jQuery 对象。在这种情况下,我倾向于拥有以他们的名字为关键字的地图(或对象)。该名称可能来自name 属性(如果这是一种允许name 并且有意义的元素),或者来自data-name 属性(因为您可以将data-* 属性放在任何元素上) .例如:

<input data-range="Salary" ... >
<input data-name="rangeFromSalary" ... >
<input data-name="rangeToSalary" ... >
<input data-range="Age" ... >
<input data-name="rangeFromAge" ... >
<input data-name="rangeToAge" ... >
const rangeInputs = new Map($("[data-name]").map((i, input) => {
    return [input.getAttribute("data-name"), $(input)];
}));
function updateInputs(data) {
    // Note: You need to declare `from` and `to`
    const from = data.from;
    const to = data.to;
    // Get the name for this input
    const rangeName = data.input.getAttribute("data-range");
    // Get the matching jQuery objects
    const rangeFrom = rangeInputs.get(`rangeFrom${inputName}`);
    const rangeTo   = rangeInputs.get(`rangeTo${inputName}`);
    // Got them?
    if (rangeFrom && rangeTo) {
        // Set them
        rangeFrom.prop("value", from);
        rangeTo.prop("value", to);
    }
  
    table.draw();
}

请注意,我添加了 from 和 to 的声明。没有它们,您的代码就会成为我所说的The Horror of Implicit Globals 的牺牲品。总是声明你的变量。


在评论中,您似乎担心使用 ES2015+ 功能。以下是仅使用 ES5 及以下功能的上述内容:

var rangeInputs = Object.create(null);
$("[data-name]").each((i, input) => {
    rangeInputs[input.getAttribute("data-name")] = $(input);
});
function updateInputs(data) {
    var from = data.from;
    var to = data.to;
    // Get the name for this input
    var rangeName = data.input.getAttribute("data-range");
    // Get the matching jQuery objects
    var rangeFrom = rangeInputs.get(`rangeFrom${inputName}`);
    var rangeTo   = rangeInputs.get(`rangeTo${inputName}`);
    // Got them?
    if (rangeFrom && rangeTo) {
        // Set them
        rangeFrom.prop("value", from);
        rangeTo.prop("value", to);
    }
  
    table.draw();
}

但如果你真的,真的想使用switch:

function updateInputs(data) {
    var from = data.from;
    var to = data.to;
    var rangeFrom, rangeTo;
    switch (data.input.getAttribute("data-range")) {
        case "rangeSalary":
            rangeFrom = $("rangeFromSalary");
            rangeTo = $("rangeToSalary");
            break;
        case "rangeAge":
            rangeFrom = $("rangeFromAge");
            rangeTo = $("rangeToAge");
            break;
        // ...
    }
    if (rangeFrom && rangeTo) {
        rangeFrom.prop("value", from);
        rangeTo.prop("value", to);
    }
  
    table.draw();
}

但是请注意,现在,您在两个 位置(HTML 和代码)中拥有名称,而不仅仅是在一个位置(HTML)。这会导致您在一个地方添加或删除它们而不是另一个地方。

【讨论】:

  • 这是一篇有趣的帖子,从现在开始我将声明我所有的变量!万分感激。问题是它返回给我:'const' is available in ES6 (use esnext option) or Mozilla JS extensions (use moz). 我想使用switch…case,因为我将来要添加更多语句。请看一下:live.datatables.net/sivelagi/4/edit
  • @ArnonRodrigues - 除非你必须支持 IE11,否则这些天你可以很好地使用 ES2015+ 功能。但是我在上面添加了一个 ES5 和更早的版本,它甚至可以在 IE11 上运行。您可以为此使用switch,但我认为查找对象/映射更有意义。
  • 实际上是 live.datatable 警告了const 的可用性。我正在分析您回答的所有内容,这与我应该做的非常不同,而且看起来更好。我真的很感谢你的帮助!非常感谢!!
猜你喜欢
  • 2022-08-23
  • 1970-01-01
  • 2019-04-09
  • 2010-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-20
相关资源
最近更新 更多