【发布时间】:2021-05-12 12:49:21
【问题描述】:
我有一个按多个参数过滤结果的功能,例如name、status、type 和日期范围(startDate 和 endDate)。我希望能够通过这些参数一起过滤结果,但前提是它们存在,即。 e.我可以通过name 和status,但不要通过type。我不知道如何在日期范围内做到这一点。现在过滤器只有在我通过startDate和endDate时才起作用,在所有其他情况下,即使存在其他参数并且数组中有相应的数据,它也会返回null。如何将startDate 和endDate 设为可选?
这是我的过滤器:
if (params.name || params.status || params.type || params.startDate && params.endDate) {
const startDate = new Date(params.startDate).setHours(0,0,0);
const endDate = new Date(params.endDate).setHours(23,59,59);
dataSource = tableListDataSource.filter(
(data) =>
data.name.match(new RegExp(params.name, 'ig')) &&
data.status.includes(params.status || '') &&
data.type.includes(params.type || '') &&
(
new Date(data.createdAt).getTime() > startDate && new Date(data.createdAt).getTime() < endDate
)
);
}
感谢您的帮助!
编辑:
我在后端的一个函数中使用这个过滤器:
function getRule(req, res, u) {
let realUrl = u;
if (!realUrl || Object.prototype.toString.call(realUrl) !== '[object String]') {
realUrl = req.url;
}
const params = parse(realUrl, true).query;
if (params.name || params.status || params.type || params.startDate && params.endDate) {
const startDate = new Date(params.startDate).setHours(0,0,0);
const endDate = new Date(params.endDate).setHours(23,59,59);
dataSource = tableListDataSource.filter(
(data) =>
data.name.match(new RegExp(params.name, 'ig')) &&
data.status.includes(params.status || '') &&
data.type.includes(params.type || '') &&
(
new Date(data.createdAt).getTime() > startDate && new Date(data.createdAt).getTime() < endDate
)
);
}
const result = {
data: dataSource,
success: true,
};
return res.json(result);
}
【问题讨论】:
-
1) ||将比较值转换为布尔值。因此,即使您将值设置为 0,您对该值的检查也会失败。采用 ??相反或 params.hasOwnProperty("type"), ... 2) 这是对象销毁中预定义参数的完美案例。您的函数可能看起来像 function ({name = null, type = null, status = null} = {}) {...} 只需为它编写一个程序。在每个非空选项的 filter() 内部进行检查。如果所有检查都通过返回 true,否则在第一次失败时返回 false。
-
@KaiLehmann 非常感谢您的回复。您能否举一个此类功能的示例并将其发布为答案?
-
@KaiLehmann 参数在这样的 url 中传递:
/api/order?startDate=2021-02-09&endDate=2021-03-15,所以它不是一个对象 -
这能回答你的问题吗? Filter collection with optional values
-
@KaiLehmann 非常感谢,我去看看!
标签: javascript filter filtering