【问题标题】:Simply if statements es6简单的 if 语句 es6
【发布时间】:2022-01-26 06:08:25
【问题描述】:

有什么方法可以让下面的 if 语句更简单 -

if (data1 && data2 && data3) { return 'A'; }
if (!data1 && data2 && data3) { return 'B'; }
if (!data1 && !data2 && data3) { return 'C'; }

【问题讨论】:

  • 你关心(data1 && !data2 && !data3) 吗?
  • 对于您未在此处显示的其他排列,您打算返回什么?对于三个布尔值,不止这三个排列(2^3 = 8 个排列)。如果我们了解所有可能的排列将返回什么,我们就可以更好地了解整个问题。
  • 另外,这些值是真正的布尔值还是只是在测试任何真/假值?

标签: javascript if-statement ecmascript-6 conditional-statements


【解决方案1】:

您可以嵌套它们以组合常见的条件。

if (data1) {
    if (data2 && data3) {
        return 'A';
    }
} else {
    if (data3) {
        if (data2) {
            return 'B';
        } else {
            return 'C';
        }
    }
}

这是否“更简单”是个人品味的问题。

【讨论】:

    【解决方案2】:

    我倾向于使用查找表而不是嵌套的 if/then else 语句,因为通常看起来数据结构比代码中的实际逻辑行更易于维护和扩展。此表可扩展至您想去的任何地方。

    对于三个布尔值,有 2^3 = 8 种可能的排列。如果您只想考虑问题中的特定 3 个排列,您可以使用稀疏查找表和一些数学来计算查找索引。查找表中的值以外的值将从查找中返回 undefined

    // Values to test for:
    // true, true, true - 111
    // false, true, true - 11
    // false, false, true - 1
    const table = {
        "111": 'A',
        "11": 'B',
        "1": 'C'
    }
    
    const data1 = false;
    const data2 = true;
    const data3 = true;
    const lookupIndex = (!!data1 * 100) + (!!data2 * 10) + (!!data3);
    console.log(table[lookupIndex]);

    根本没有if/else 逻辑。只需计算和查表即可。

    注意!! 将值强制转换为布尔值,以防它们不是布尔值,然后* 运算符会将它们转换为01

    另外,请注意,如果您开始寻找所有可能的 8 种排列,或者如果您随后有更多变量要添加到组合中,则此处的代码节省会显着增加。

    这将转换为十进制,将每个布尔值加权为 10 的幂(data1 是 10^2,data2 是 10^1,data3 是 10^0)。它可以转换为二进制,将每个布尔值加权为 2 的幂,但对于这么少的项目,十进制似乎更容易。


    或者,这是一个版本,您实际上将布尔值保留在我认为我更喜欢的表中:

    const table = {
        "true,true,true": 'A',
        "false,true,true": 'B',
        "false,false,true": 'C'
    }
    
    const data1 = "";
    const data2 = "hello";
    const data3 = true;
    const lookupIndex = `${!!data1},${!!data2},${!!data3}`;
    console.log(table[lookupIndex]);

    如果您想考虑所有 8 种可能性,甚至可能想扩展以在查找表中包含其他非布尔值,您可以使用完整且可扩展的查找表。此表可扩展为布尔值以外的值(如果您删除 !! 布尔值强制,则可以使用字符串或数字:

    const table = {
        true: {
            true: {
                true: 'A',
                false: 'true/true/false'
            },
            false: {
                true: 'true/false/true',
                false: 'true/false/false'
            }
        },
        false: {
            true: {
                true: 'B',
                false: 'false/true/false'
            },
            false: {
                true: 'C',
                false: 'true/false/false'
            }
        }
    }
    
    const data1 = false;
    const data2 = true;
    const data3 = true;
    
    console.log(table[!!data1][!!data2][!!data3]);

    【讨论】:

    • @AbhishekKonnur - 这样的东西对你有用吗?
    猜你喜欢
    • 2020-02-22
    • 2019-03-17
    • 1970-01-01
    • 1970-01-01
    • 2017-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多