寻找一种简化带有多个||的if语句的方法

时间:2011-07-12 12:48:07

标签: javascript jquery mobile filter

我有这个JQuery / Javascript代码块来按搜索条件过滤我的列表。它很长,看起来有点不专业。有没有办法简化它?

喜欢“.contains()”?

如果有人能指出我正确的方向,我会非常感激。谢谢!

继承人的代码;问我是否需要更多:

 $.each(catalog.products,
      function(index, value) {

          if ((filterValue == '' || filterValue == null)
                  || value.name.toUpperCase().indexOf(filterValue.toUpperCase()) != -1
                  || value.brand.toUpperCase().indexOf(filterValue.toLocaleUpperCase()) != -1
                  || value.category.toUpperCase().indexOf(filterValue.toUpperCase()) != -1
                  || value.sport.toUpperCase().indexOf(filterValue.toUpperCase()) != -1)
          {
              items.push('<li id="' + index + '">' +
                      '<a data-identity="productId"  href="./details.page?productId=' + index + '" >' +
                      '<img class="ui-li-thumb" src="' + value.thumbnail + '"/>' +
                      '<p>' + value.brand + '</p>' +
                      '<h3>' + value.name + '</h3>' +
                      '<span class="ui-li-count">' + value.price + ' $</span></li>') +
              '</a>';
          }

      }
        );

3 个答案:

答案 0 :(得分:4)

“简化”代码的简单方法是

  var filterUpper = !filterValue || filterValue.toUpperCase();
  var test = function(s) {return s.toUpperCase().indexOf(filterUpper) != -1};

  if (!filterValue || test(value.name) || test(value.brand) || test(value.category) || test(value.sport))   {
   ...

答案 1 :(得分:1)

我建议你阅读以下重构模式:

这个想法是你试图在if语句上推断一些内容,并且它不是'indexOf'这是一个业务规则,试着给该规则命名并将代码放在表达意图的方法中。

只是我的0.02

答案 2 :(得分:1)

我要做的第一件事就是注意以下代码片段:

(filterValue == '' || filterValue == null)

可以更改为

!filterValue

这是因为在javascript中将null或空字符串变量视为'falsy',即当被视为布尔值时,这些值将转换为false。

然后我会像亚历山大·盖斯勒[1]那样做,并将过滤掉的filterValue.toUpperCase()分解出来。

[1] Looking for a way to simplify an if statement with multiple ||