在 JS 中格式化简单 when 函数的最佳方式

Best Way to Format a Simple When Function in JS

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

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

考虑到它缺少 "when" 函数,我正在考虑如何在 JS 中最好地格式化它。

作为参考,N、S、E 和 W 是 "directions",并且别名如下: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;

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

拿一个对象也一样。

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];

我建议您创建一个将方向映射到别名的对象,并将其用于 return 函数的正确别名。

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

通过使用上面几个用户建议的对象,我们可以使这段代码更简单。但是,我们 运行 使用文字字符串 "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]