【问题标题】:if/else statement instead switchif/else 语句改为 switch
【发布时间】:2015-11-20 08:37:16
【问题描述】:

我有这个 ajax 请求:

    SJA.ajax(dataToSend, //this is internal method, which sends requests to the urls  
function (respond) {

      var categorySelect = that.$modal.find('.cat-post')[0].selectize; //using selectize.js plugin for selects. 

          if (respond) {
          callback && callback(respond);
          for (var i in respond) {
            //console.log(respond[i].id);
            //console.log(respond[i].name);
            categorySelect.addOption({value: respond[i].id, text: respond[i].name}); //adding new options to a select field.
          }
        }
    });
  var category: that.$modal.find('.cat-post').val() //this is option value in select field !== 'null' ? $('.cat-post').val() : null, //this variable is responsible for keeping selected data. 

然后我比较选定的数据(因为我需要获取一些字符串值才能在表中使用它):

var categoryName = 'all';
        switch (category) {
          case '0' // compare with respond id: 
            categoryName = "all" // compare with respond name ;
            break;
          case '1':
            categoryName = "Health";
            break;
          case '2':
            categoryName = "Cars";
            break;
        }

然后我在我的表中添加新的 td。

  $tbody.append(['<tr data-id="' + row.id + '">',
'<td class="restricted-view-hide view-mode2-hidden view-mode21-hidden">'  + categoryName + '</td>', '</tr>'].join(''));

但我不想每次都在 switch 中输入新值,我想使用一些东西来动态接收新值。 我尝试过这样的事情:

categoryName = respond[i].id != null ? respond[i].name : "any";

但它不起作用。有任何想法吗?

【问题讨论】:

  • 您在开关上定义了类别,并且您在传递它时大小写与值不匹配。
  • @Jai 我已经改变了问题。
  • 嗨,Max,在任何人尝试回答之前,您确实需要先澄清一下 - 我试过了,问题太多了,太长了!你到底想达到什么目的?您发布的 if/else 语句与 switch 语句完全不同,在过程中使用不同的值。这是故意的吗?
  • @IStanley 对此感到抱歉。我会尝试编辑我的问题。只需 5 分钟。

标签: javascript jquery ajax if-statement switch-statement


【解决方案1】:

没错。假设:

1) 您知道您发布的条件语句使用了 respond.id 和 respond.name,而您的 switch 语句使用了 $(".cat-post").val(),并且这两种方法很可能返回完全不同的值。

2) 您发布的条件语句使用您希望它使用的变量,它只是没有给出预期的答案 - 也就是说,在 response.id 无效的情况下,它没有给您“任何” .

如果是这种情况,那么解决方案就足够简单了。没有 id 的元素为 .id 返回 "",而不是 null,因此请检查是否 respond.id != "",而不是 != null。

categoryName = respond[i].id != "" ? respond[i].name : "any";

也就是说……

categoryName = respond[i].id != null ? respond[i].name : "any";

这看起来不太对劲。它基本上说“如果我的响应元素有一个 id,则使用它的名称值作为 categoryName”。这是你想要的吗?如果 respond[i].id 是,你能确定 respond[i].name 总是有效的吗?为什么不只检查 respond[i].name 是否为 != ""?如果没有设置 id 属性,是否对 name 属性的有效性有疑问?使用

categoryName = respond[i].name != "" ? respond[i].name : "any";

看起来更有意义。

还值得注意的是,假设 1) 是一个相当大的假设。如果您的代码当前正在按照您希望的方式工作,但您想让它更灵活,除非存在一些严重的数据重复(其中 $(.cat-post)[0].val() 设置为一些由 respond[i].name 确定的值(反之亦然)),实现你上面的内容会破坏你的代码。

请注意,这仅适用于您的代码基本上可以正常工作但给您错误值的情况。如果它坏了,根本没有给你任何回应,那么你需要更具体地说明“它不起作用”的意思。

【讨论】:

  • 感谢您的回答。所以我的主要目标是接收文本值,我将其添加到表格中。当我使用 switch 语句时效果很好,因为我正在将 ID(在选择字段中选择)与 switch-case 中的字符串进行比较。如果我发现同意,我会将文本值添加到我的表格中。我不知道如何改进此代码以使其更加独立(因为如果将来有人更改类别,则需要在 switch 语句中添加新案例)结果。第一个想法是改变 if/else 语句的开关......但我不确定这个解决方案。或许你能给出更好的建议?
  • 如果您在响应元素中有一个字段/属性是您想要使用的 CategoryName,请务必使用它,但请注意,您将依赖于数据的质量寄给你。独立永远是一把双刃剑;从表面上看它需要较少的维护,因为当有人添加新类别时你不需要添加新条目,但这也意味着你不再对类别有任何控制权,如果有人输入乱码数据它最可能不会得到妥善处理
【解决方案2】:

不知道它是否可以改变任何东西,但尝试:

categoryName = (respond[i].id != null) ? respond[i].name : "any";

也许是^^

【讨论】: