我尝试在`过滤器中应用条件链。如何将先前条件中的结果加入并传递下一个结果:
this.fltRooms = this.rooms.filter(room => {
let _rule;
if (formValues["auditoryNumber"]) {
_rule = formValues["auditoryNumber"] == room.title;
}
if (formValues["floor"]) {
_rule = formValues["floor"] == room.floor; // Should be AND
}
if (formValues["corpus"]) {
_rule = formValues["corpus"] == room.building; // Should be AND
}
return _rule;
});
因此,逻辑是,如果存在formValues["auditoryNumber"]
和formValues["floor"]
和formValues["corpus"]
,则按所有三个条件进行过滤,且介于AND
之间。
答案 0 :(得分:3)
如果都不存在怎么办?
正如您所描述的,它应该非常简单。像
this.fltRooms = this.rooms.filter(room =>
formValues["auditoryNumber"] == room.title
&& formValues["floor"] == room.floor
&& formValues["corpus"] == room.building);
答案 1 :(得分:2)
替代@bipll正确答案,使用定义的键数组进行比较
this.filtRooms = this.rooms.filter(x => [
'auditoryNumber',
'floor',
'corpus',
].every(y => x[y] === formValues[y]));
如果要比较的两个对象上的键不同
this.filtRooms = this.rooms.filter(x => [
[
'auditoryNumber',
'title',
],
[
'floor',
'floor',
],
[
'corpus',
'building',
],
].every(([
key1,
key2,
]) => x[key1] === void 0 || x[key1] === formValues[key2]));
答案 2 :(得分:2)
基本上,您想说是否未设置过滤器为真。如果设置了过滤器,则检查值是否匹配。
this.fltRooms = this.rooms.filter(room =>
(!formValues["auditoryNumber"] || formValues["auditoryNumber"] == room.title) &&
(!formValues["floor"] || formValues["floor"] == room.floor) &&
(!formValues["corpus"] || formValues["corpus"] == room.building)
)
使用ifs的其他方法是在每张支票中使用布尔值
this.fltRooms = this.rooms.filter(room => {
let _rule = true
if (formValues["auditoryNumber"]) {
_rule = formValues["auditoryNumber"] == room.title;
}
if (_rule && formValues["floor"]) {
_rule = formValues["floor"] == room.floor; // Should be AND
}
if (_rule && formValues["corpus"]) {
_rule = formValues["corpus"] == room.building; // Should be AND
}
return _rule;
});
答案 3 :(得分:0)
this.filterRooms = this.rooms.filter(meetsSearchParams);
function meetsSearchParams(room){
return room.auditoryNumber == formValues["auditoryNumber"] &&
room.floor == formValues["floor"] &&
room.corpus == formValues["corpus"];
}
为了尽可能使内容可读。
答案 4 :(得分:0)
如果您需要扩展它,请在两个结构之间建立一个映射数组
var fields = [
{f: "auditoryNumber", p: "title"},
{f: "floor", p: "floor"},
{f: "corpus", p: "building"}
];
this.fltRooms = this.rooms.filter(room =>
fields.every(field => !formValues[field.f] || formValues[field.f] == room[field.p]);
)