如何在我的过滤器中允许空结果?

时间:2014-05-09 21:12:41

标签: javascript jquery

我使用此函数过滤数组的元素:

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 }); 

但是,如果用户没有输入任何内容,则结果将不返回任何内容。我正在尝试对其进行编码,以便如果他们没有为该特定条件选择任何内容,那么它就不会对其进行过滤。

3 个答案:

答案 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];
        });
    });
}