当前位置: 首页 > 知识库问答 >
问题:

更改if else以切换case语句

陶智
2023-03-14

我有一个函数,有一些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个答案

秦育
2023-03-14

代码的问题是,从hasclass得到的结果将是truefalse,两者都不匹配您的任何案例标签。

请注意,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();
}

注意,我添加了fromto的声明。没有它们,您的代码就会成为我所说的隐式全局的恐怖的猎物。始终声明变量。

在一篇评论中,你似乎担心使用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();
}

但如果您真的非常非常想使用开关:

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)。这就会出现这样的情况,即在一个地方添加或删除它们,而不是在另一个地方添加或删除它们。

 类似资料:
  • 问题内容: 我的转换案例声明昨天运行良好。但是,当我今天早些时候运行代码时,eclipse给我一个错误,强调了红色的case语句,并说:case表达式必须是常量表达式,它是常量,我不知道发生了什么。这是我的代码如下: 所有R.id.int都用红色下划线。 问题答案: 在常规的Android项目中,资源R类中的常量声明如下: 但是,从ADT 14开始,在图书馆项目中,它们将这样声明: 换句话说,常数

  • 问题内容: 在最新的Java和Eclipse稳定发行版(Kempler)中,假设存在程序包和类名称,请输入以下代码并执行该代码: 这将打印值4。最初,我认为应该打印2,因为我认为即使没有break语句,每段代码仍保留在case语句中。现在,我认为问题在于如何编译。例如,我目前的信念是在内部使用布尔值来跟踪case语句是否等于该值。如果是,则布尔值为true,并且 所有case语句将被视为true,

  • 本文向大家介绍Swift中的条件切换语句switch...case学习教程,包括了Swift中的条件切换语句switch...case学习教程的使用技巧和注意事项,需要的朋友参考一下 语法 Swift 语言中 switch 语句的语法: 注意:在大多数语言中,switch 语句块中,case 要紧跟 break,否则 case 之后的语句会顺序运行,而在 Swift 语言中,默认是不会执行下去的,

  • Erlang提供case语句,可用于根据case语句的输出执行表达式。 本声明的一般形式是 - 语法 (Syntax) case expression of value1 -> statement#1; value2 -> statement#2; valueN -> statement#N end. 本声明的一般工作如下 - 要评估的表达式放在case语句中。 这通常会评估为

  • 问题内容: 我有一个引导网站,当屏幕尺寸小于992px时,会添加Hamburger切换器。代码如下: 可以更改汉堡切换按钮的颜色吗? 问题答案: Bootstrap 4中的(汉堡包)使用SVG 。切换器图标图像有2个“版本”。一个用于浅色导航栏,另一个用于深色导航栏… 使用了较深的背景光/白色toggler 使用上较亮的背景黑色/灰色toggler 因此,如果要将切换器图像的颜色更改为其他颜色,可

  • 问题内容: 这个问题是JSF 2中较早的Languageswitcher实现的后续。 尽管PrimeFaces发布了一些较新的版本,但该问题的实质仍然有效,而我的JSF知识比以前更好了。 总而言之,我只有一个xhtml页面,将其完全合并。 语言切换器是这样的: 我希望在 选择时仅 显示标志,反之亦然。我希望使用Resource Bundle翻译来更新网页中的所有内容。 特别是,我有一些S,其标头属