首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用jQuery的filter()函数提取具有不同条件的数组

使用jQuery的filter()函数提取具有不同条件的数组
EN

Stack Overflow用户
提问于 2011-09-08 00:49:29
回答 3查看 1.1K关注 0票数 4

我有一个存储在javascript中的基本数据集,我想根据用户选中的复选框对其进行过滤。我知道我可以使用jQuery的filter()函数根据多个条件过滤结果集,但是我遇到的问题是,条件会根据用户输入而变化。

代码语言:javascript
复制
var myArray = [["Adelaide", 2, "yes", "female"],
           ["Ada", 2, "yes", "female"],
           ["Amanda", 1, "yes", "female"],
           ["Wolf", 3, "no", "male"],
           ["Rhonda", 1, "no", "female"]];

HTML:

代码语言:javascript
复制
<input id="rate-3" name="rating" type="checkbox" value="rate-3" />3 Stars<br />
<input id="rate-2" name="rating" type="checkbox" value="rate-2" />2 Stars<br />
<input id="rate-1" name="rating" type="checkbox" value="rate-1" />1 Star<br />
<a href="#" id="submitform">Submit Filters</a>

如何将多个条件传递给.filter(函数)?例如,有人可能会选择rate-1和rate-3复选框,这是我目前硬编码函数要查找的,但我希望它根据用户提交的输入而灵活。

我想我可以只写一些if/else语句,但是有没有更优雅的方法呢?

JQuery:

代码语言:javascript
复制
$("#submitform").click(function() {
    var userSelectedFilters = new Object();

    userSelectedFilters.rate3 = $("#rate-3").is(':checked');
    userSelectedFilters.rate2 = $("#rate-2").is(':checked');
    userSelectedFilters.rate1 = $("#rate-1").is(':checked');

    var filteredArray = myArray.filter(
    function(el) {
       // currently hardcoded
       return ((el[1] == 1) || (el[1] == 3));
     }
    );

});
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-09-08 00:56:09

构建一个数组并检查该数字是否包含在数组中:

代码语言:javascript
复制
$("#submitform").click(function() {
    var userSelectedFilters = [];

    $("#rate-3").is(':checked') && userSelectedFilters.push(3);
    $("#rate-2").is(':checked') && userSelectedFilters.push(2);
    $("#rate-1").is(':checked') && userSelectedFilters.push(1);

    var filteredArray = myArray.filter(
    function(el) {
       // currently hardcoded
        return userSelectedFilters.indexOf(el[1]) !== -1;
     }
    );
});

虽然indexOf不是通用的,但它有一个填充:

代码语言:javascript
复制
if (!Array.prototype.indexOf) {
    Array.prototype.indexOf = function (searchElement /*, fromIndex */ ) {
        "use strict";
        if (this === void 0 || this === null) {
            throw new TypeError();
        }
        var t = Object(this);
        var len = t.length >>> 0;
        if (len === 0) {
            return -1;
        }
        var n = 0;
        if (arguments.length > 0) {
            n = Number(arguments[1]);
            if (n !== n) { // shortcut for verifying if it's NaN
                n = 0;
            } else if (n !== 0 && n !== window.Infinity && n !== -window.Infinity) {
                n = (n > 0 || -1) * Math.floor(Math.abs(n));
            }
        }
        if (n >= len) {
            return -1;
        }
        var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0);
        for (; k < len; k++) {
            if (k in t && t[k] === searchElement) {
                return k;
            }
        }
        return -1;
    }
}
票数 2
EN

Stack Overflow用户

发布于 2011-09-08 01:00:28

你可能要检查你的html,并使用name="rating[]“为每个框,这将省去你很多头疼。

实际上,在您的提交函数中:

代码语言:javascript
复制
$('input:checked').each( function () {
   userSelectedFilters[this.id] = this.id;
});

但同样,可以避免完整的代码堆栈,只需对stackoverflow (或google)做一点研究即可。不管怎样:下面是你的代码:

代码语言:javascript
复制
var myArray = [["Adelaide", 2, "yes", "female"],
           ["Ada", 2, "yes", "female"],
           ["Amanda", 1, "yes", "female"],
           ["Wolf", 3, "no", "male"],
           ["Rhonda", 1, "no", "female"]];

$("#submitform").click(function() {

    var choices = [];

    $('input:checked').each( function () {
       choices.push(this.id.charAt(this.id.length-1)); 

    });


    var filteredArray = myArray.filter(
    function(el) {

       for (i in choices) {
            if ( choices[i] == el[1] ) {
                return true;
            }
       }
       return false
     }
    );

    console.log (filteredArray );

});
票数 1
EN

Stack Overflow用户

发布于 2011-09-08 01:02:54

你可以这样做:

代码语言:javascript
复制
var myArray = [["Adelaide", 2, "yes", "female"],
           ["Ada", 2, "yes", "female"],
           ["Amanda", 1, "yes", "female"],
           ["Wolf", 3, "no", "male"],
           ["Rhonda", 1, "no", "female"]];

$("#submitform").click(function() {

    var userSelectedFilters = [];
    $("input:checkbox:checked").each(function(){
         userSelectedFilters.push(this.value)
    });



    var filteredArray = myArray.filter(
    function(el) {
       // currently hardcoded
        for (i =0, lungh = userSelectedFilters.length ; i< lungh; i++){
            console.log(userSelectedFilters[i]);
            if (el[1] == userSelectedFilters[i]){
               return true;
            }

        }
        return false;
     }
    );


});

小提琴在这里:http://jsfiddle.net/pWJwt/

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7337579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档