我有一个存储在javascript中的基本数据集,我想根据用户选中的复选框对其进行过滤。我知道我可以使用jQuery的filter()函数根据多个条件过滤结果集,但是我遇到的问题是,条件会根据用户输入而变化。
var myArray = [["Adelaide", 2, "yes", "female"],
["Ada", 2, "yes", "female"],
["Amanda", 1, "yes", "female"],
["Wolf", 3, "no", "male"],
["Rhonda", 1, "no", "female"]];HTML:
<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:
$("#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));
}
);
});发布于 2011-09-08 00:56:09
构建一个数组并检查该数字是否包含在数组中:
$("#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不是通用的,但它有一个填充:
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;
}
}发布于 2011-09-08 01:00:28
你可能要检查你的html,并使用name="rating[]“为每个框,这将省去你很多头疼。
实际上,在您的提交函数中:
$('input:checked').each( function () {
userSelectedFilters[this.id] = this.id;
});但同样,可以避免完整的代码堆栈,只需对stackoverflow (或google)做一点研究即可。不管怎样:下面是你的代码:
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 );
});发布于 2011-09-08 01:02:54
你可以这样做:
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/
https://stackoverflow.com/questions/7337579
复制相似问题