基于三个或更多输入的Lodash滤波器。

问题描述 投票:0回答:1

我试图构建一个基于三个输入选择器的过滤器。其逻辑如下。

  • 如果三个输入中只有一个被选中,那么过滤器应该只返回这个选择器的值,而不是未选中的输入。
  • 如果选择了三个输入中的两个,那么过滤结果应该只基于这两个,而不是未选择的输入。
  • 如果三个输入都被选中,则应在所有三个输入上过滤结果。

我的代码感觉很啰嗦,而且不可扩展(见下文)。有谁知道如何优化这个问题吗?

这是我目前的工作内容。hasSelectedBuildingtype,hasSelectedInstrumenthasSelectedRegion 检查输入是否被选中。因此,我正在手动检查所有输入的状态。

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

谢谢!

javascript lodash
1个回答
0
投票

你可以做的一件事是在每个布尔标志中使用位别名。你需要一个合同,用一个整数来说明每个标志的位置。所以假设

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。

© www.soinside.com 2019 - 2024. All rights reserved.