2015-10-13 74 views
0

我目前正在尝试使JavaScript中的过滤器功能允许您从预定义列表中进行选择以缩小所选选项的范围。多个如果和/或条件

该过滤器有多个选项,它足够简单,可以根据过滤器中的匹配缩小列表的范围,当时只有一个选项。但是,如果选择多个选项,我想根据匹配来缩小列表的范围。

示例:用户输入“Hello”作为关键字“Company”的过滤选项,这将导致选择仅匹配Company == Hello。如果用户然后选择了第二个选项,即“位置”关键字的“美好的一天”,那么如果关键“公司”和“位置”匹配,我只想缩小列表的范围。

如果没有真正编写任何代码,那么我知道这可以用很多AND OR来完成,但我希望有一个更方便的方法来做到这一点,我没有看到。

var position = $('select[name=order_position]').select2('val'); 
var industry = $('select[name=order_industry]').select2('val'); 
var company  = $('select[name=order_company]').select2('val'); 

$('.mail_select_prospect').each(function() { 

    var prospect_existing = $(this).attr('data-existing'); 
    var prospect_position = $(this).attr('data-position'); 
    var prospect_industry = $(this).attr('data-industry'); 
    var prospect_company = $(this).attr('data-company'); 
    var self = $(this); 

    if(
     ($.inArray(prospect_position, position) !== -1) || 
     ($.inArray(prospect_industry, industry) !== -1) || 
     ($.inArray(prospect_company, company) !== -1) || 
     ($('input[name=order_existing]').is(':checked') && prospect_existing == 1) || 
     ($('input[name=order_nonexisting]').is(':checked') && prospect_existing == 2) 
    ) { 

     self.prop('checked', true); 

    } else { 

     self.prop('checked', false); 

    } 

}); 

这是我目前有,这个发现匹配基于一个关键的匹配,而我只想要符合所有的过滤器的选择的结果。不只是一个。

使用& &整个方式,将强制用户在过滤器踢(显然),我希望它是可以选择一个关键字,并与那些谁拥有该关键字或获得比赛之前选择在每个过滤选项的东西如果选择了两个关键字,我只希望两个关键字都存在的匹配。

有什么建议吗?

+0

当然,这是可能的,但我们需要知道在什么情况下,以帮助你。如果根据输入值生成一系列事物,那么只有在选择了一个值的情况下才能生成每个部分,因此选择的部分越多,生成的部分越多。你能发布更多的代码吗? –

+0

更新了代码:) – Freddy

回答

1

我可能会建议使用conditional ternary operator。如果定义了过滤器标准,则使用它;否则应始终通过该标准的检查。所以,一个剥离下来的例子可能是这样的

if (
    (position && position.length ? $.inArray(prospect_position, position) !== -1 : true) 
    && (industry && industry.length ? $.inArray(prospect_industry, industry) !== -1 : true) 
    && ($('input[name=order_existing]').is(':checked') ?prospect_existing == 1 : true) 
) { 
    ... 
} 

而且,由于你在当前的示例代码只设置一个值true或false在此基础上有条件的检查,你可以只直接分配过滤结果(或者为了清晰起见使用中间变量),

var include = (position && position.length ? $.inArray(prospect_position, position) !== -1 : true) && ... ; 
self.prop('checked', include); 
+0

这几乎可行。但是,如果prospect_existing是真的,我只会得到结果。 – Freddy

+0

那么,我起初在我的示例代码中出现了一个错误,我在.is(':checked')条件和prospect_existing == 1比较中颠倒了。我在你的评论看来似乎已经解决了这个问题,或许你抄袭了这个错误。 – Thernys

+0

太棒了!非常棒。 '?prospect_existing == 1?'应该是'?prospect_existing == 1:'但除此之外它是完美的。 – Freddy