我使用此函数过滤数组的元素:
function filter(arr, criteria) {
return arr.filter(function(obj) {
return Object.keys(criteria).every(function(c) {
return obj[c] == criteria[c];
});
});
}
var newarr = filter(arr, { desc: dv, aasc: av, rev: cv, flo: acv });
但是,如果用户没有输入任何内容,则结果将不返回任何内容。我正在尝试对其进行编码,以便如果他们没有为该特定条件选择任何内容,那么它就不会对其进行过滤。
答案 0 :(得分:0)
我正在尝试对其进行编码,以便如果他们没有为该特定条件选择任何内容,那么它就不会对其进行过滤。
然后这样做。从用户输入获取过滤器作为对象,或者如果没有提供过滤器,则null
然后执行某些操作,如下所示:
var userFilters = ... // get filters
var newarr = userFilters ? filter(arr, userFilters) : arr;
如果出于某种原因,这对您不起作用,您可以随时重写filter
方法:
function filter(arr, criteria) {
if (criteria)
return arr.filter(function(obj) {
return Object.keys(criteria).every(function(c) {
return obj[c] == criteria[c];
});
});
else
return arr;
}
但是,根据您的评论,您的意思似乎只是如果未提供值,您不想应用该过滤器,但其他过滤器仍然适用。在这种情况下,您当前的代码可以正常工作,只需更改您生成过滤器对象的方式:
var userFilters = {};
if (dv) userFilters[desc] = dv;
if (av) userFilters[aasc] = av;
if (cv) userFilters[rev] = cv;
if (acv) userFilters[flo] = acv;
var newarr = filter(arr, userFilters);
这是有效的,因为它只会在指定过滤器集合时添加元素。如果没有添加任何项目,则会不加修改地返回arr
。
答案 1 :(得分:0)
您可以查看任何值的条件吗?
function filter(arr, criteria) {
if(criteria)
{
return arr.filter(function(obj) {
return Object.keys(criteria).every(function(c) {
return obj[c] == criteria[c];
});
});
}
else
{
return error of some kind.
}
}
或者您可以在过滤器输入上添加空输入检查...
答案 2 :(得分:0)
也许我没有得到它,但你不会只检查空值
function filter(arr, criteria) {
return arr.filter(function(obj) {
return Object.keys(criteria).every(function(c) {
return !(criteria[c]) || obj[c] == criteria[c];
});
});
}