【问题标题】:Best Way to Format a Simple When Function in JS在 JS 中格式化简单 when 函数的最佳方法
【发布时间】:2020-06-20 11:56:16
【问题描述】:

我在 Ruby 中找到了这段代码(来自 here):

DX = { E => 1, W => -1, N =>  0, S => 0 }

我正在考虑如何在 JS 中最好地格式化它,因为它缺少“何时”功能。

作为参考,N、S、E 和 W 是“方向”,并具有如下别名:const N = 1, S = 2, E = 4, W = 8;

我本来想做一个快速箭头功能,后来做了这个:

function DX(dir) {
    if(dir==E) return 1;
    if(dir==W) return -1;
    if(dir==N) return 0;
    if(dir==S) return 0;
}

我觉得有点长,所以我试着缩短它:

function DX(dir) {
    if(dir==E) return 1;
    if(dir==W) return -1;
    return 0;
}

然后再说一遍:

function DX(dir) {
    return dir==E ? 1 : dir==W ? -1 : 0;
}

但是现在我们遇到了这个代码不太可读的问题。所以我决定记录下来:

// returns the distance in x traveled by that direction
// E => 1, W => -1, N =>  0, S => 0
function DX(dir) {
    return dir==E ? 1 : dir==W ? -1 : 0;
}

最后,我将其转换为变量语法和箭头函数:

let DX = (dir) => dir==E ? 1 : dir==W ? -1 : 0;

现在显然,所有这些代码都有效,但我的问题是作为一种风格,被认为是“最好的”,无论是在行业中,在您看来,还是在您具体工作的地方?我认为可读性高于一切,那么您认为哪个代码最易读?我个人更喜欢文档部分。

【问题讨论】:

  • DX = dir => !!(dir&4) - !!(dir&8)。不过开个玩笑。

标签: javascript readability code-readability


【解决方案1】:

通过使用上面几个用户建议的对象,我们可以使这段代码更简单。但是,我们遇到了使用文字字符串“N”、“S”、“E”和“W”而不是变量的数值 1、2、4 和 8 的对象问题。

我找到了这个问题的答案on SO,它只是添加方括号(在 ES6 中):

const N = 1, S = 2, E = 4, W = 8;
const DX = { [E]: 1, [W]: -1, [N]: 0, [S]: 0 };

可用于:DX[dir]

【讨论】:

    【解决方案2】:

    对一个对象也一样。

    const DX = { E: 1, W: -1, N: 0, S: 0 };
    
    // use
    value = DX[dir];
    

    要使用数值作为方向,您需要将键映射到方向。

    //           N     S     E     W
    const DX = { 1: 0, 2: 0, 4: 1, 8: -1 };
    
    // use
    value = DX[dir];
    

    【讨论】:

    • 哇,我怎么没想到。谢谢你的回答:)我会赞成它,但是我不会接受只是给一些时间来让其他方法进来,因为如果可能的话我想继续讨论。这是非常干净和非常可读的。
    • 另一种变体是省略NS 键,然后省略DX[dir] ?? 0。这也可能适合用例。
    • DX = dir => {E: 1, W: -1}[dir] ?? 0 并用作value = DX(dir)
    • @JonasWilms,将值分成更多(令人困惑的)代码。
    • 其实这行不通。它采用分配给 1 的文字字符串“E”,而不是变量 E(数值)4 的值。所以 DX[dir] 返回 NaN,因为 4 不映射到任何东西。
    【解决方案3】:

    我建议您创建一个将方向映射到别名的对象,并使用它从函数中返回正确的别名。

    const DX = dir => {
        mapping = { E: 1, W: -1, N: 0, S: 0 };
        return mapping[dir];
    }
    

    【讨论】:

    • 使用一个对象的好主意,并且仍然使它具有类似于我上面的功能。然而,这个答案仍然遭受与 Nina 相同的命运,其中字母被映射到字符串“E”、“W”等,而不是具有数值的变量 (1, 2, 4, 8)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-15
    • 2011-10-20
    • 1970-01-01
    • 2015-06-27
    • 2011-09-26
    相关资源
    最近更新 更多