我试图构建一个基于三个输入选择器的过滤器。其逻辑如下。
我的代码感觉很啰嗦,而且不可扩展(见下文)。有谁知道如何优化这个问题吗?
这是我目前的工作内容。hasSelectedBuildingtype
,hasSelectedInstrument
和 hasSelectedRegion
检查输入是否被选中。因此,我正在手动检查所有输入的状态。
<!-- language: lang-js -->
result = _.filter(this.examples, function(entry) {
// Single checks (if only bulding or region or instrument selected)
if (
hasSelectedBuildingtype &&
!hasSelectedRegion &&
!hasSelectedInstrument
) {
if (
entry.buildingtypes.includes(
vm.selectedBuildingtype
)
) {
return true;
}
}
if (
hasSelectedInstrument &&
!hasSelectedRegion &&
!hasSelectedBuildingtype
) {
if (entry.instruments.includes(vm.selectedInstrument)) {
return true;
}
}
if (
hasSelectedRegion &&
!hasSelectedInstrument &&
!hasSelectedBuildingtype
) {
if (entry.regionid === vm.selectedRegion) {
return true;
}
}
// Double checks (if only bulding AND region or instrument AND etc selected)
if (
hasSelectedRegion &&
hasSelectedBuildingtype &&
!hasSelectedInstrument
) {
if (
entry.regionid === vm.selectedRegion &&
entry.buildingtypes.includes(
vm.selectedBuildingtype
)
) {
return true;
}
}
if (
hasSelectedInstrument &&
hasSelectedBuildingtype &&
!hasSelectedRegion
) {
if (
entry.instruments.includes(vm.selectedInstrument) &&
entry.buildingtypes.includes(
vm.selectedBuildingtype
)
) {
return true;
}
}
if (
hasSelectedInstrument &&
hasSelectedRegion &&
!hasSelectedBuildingtype
) {
if (
entry.instruments.includes(vm.selectedInstrument) &&
entry.regionid === vm.selectedRegion
) {
return true;
}
}
// Triple check (if all types selected)
if (
hasSelectedInstrument &&
hasSelectedRegion &&
hasSelectedBuildingtype
) {
if (
entry.instruments.includes(vm.selectedInstrument) &&
entry.regionid === vm.selectedRegion &&
entry.buildingtypes.includes(
vm.selectedBuildingtype
)
) {
return true;
}
}
});
谢谢!
你可以做的一件事是在每个布尔标志中使用位别名。你需要一个合同,用一个整数来说明每个标志的位置。所以假设
bit 0: hasSelectedBuildingtype
bit 1: hasSelectedRegion
bit 2: hasSelectedInstrument
...
那么你的初始赋值就会这样做。
let myInputFlags = hasSelectedBuildingtype << 0 |
hasSelectedRegion << 1 |
hasSelectedInstrument << 2 |
// ... << 3, << 4, etc
然后,你的比较就会变得像比较一个整数一样简单,例如。
/**
* Checking that hasSelectedBuildingtype === false
* and hasSelectedRegion === false
* and hasSelectedInstrument === true
*/
if (myInputFlags === 4) {
...
你可以进一步为比较数创建别名,比如。
let hasSelected = {
...,
INSTRUMENT_ONLY: 4,
...
};
这样你的分支就会变得更有表现力。如:;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;。
if (myInputFlags === hasSelected.INSTRUMENT_ONLY) {
...
这样一来,如果你将来想增加额外的布尔检查,你只需要维护好数值,并在公式中多加一个位智OR。