多个 if else 条件的替代方法

rub*_*ist 11 javascript ecmascript-6

我有多个条件需要检查和执行,如下所示。

if (date == current_date && source === "s3") {
    table_name = "Table1";
} else if (date == current_date && source !== "s3") {
    table_name = "Table2";
} else if (date !== current_date && source === "s3") {
    table_name = "Table3";
} else if (date !== current_date && source !== "s3") {
    table_name = "Table4";
}
Run Code Online (Sandbox Code Playgroud)

我认为在这里使用 switch 语句没有意义,因为我们没有针对 switch 表达式评估 case 语句表达式。

那么可以使用多个 if else 语句或任何更好的替代方法吗?

epa*_*llo 8

您的代码 100% 是一个不错的选择。只是有点难以阅读。您可以将公共代码提取到变量中以使其更具可读性

var isCurrent = date == current_date;
var isS3 = source === "s3";

if (isCurrent && isS3) {
    table_name = "Table1";
} else if (isCurrent && !isS3) {
    table_name = "Table2";
} else if (!isCurrent && isS3) {
    table_name = "Table3";
} else {
    table_name = "Table4";
}
Run Code Online (Sandbox Code Playgroud)

其他选择是使用三元运算符

var isCurrent = date == current_date;
var isS3 = source === "s3";

if (isCurrent) {
    table_name = isS3 ? "Table1" : "Table2";
} else {
    table_name = isS3 ? "Table3" : "Table4";
}
Run Code Online (Sandbox Code Playgroud)

它可能是一个大的三元组,但它有点不可读

var isCurrent = date == current_date;
var isS3 = source === "s3";

table_name = isCurrent ? 
    (isS3 ? "Table1" : "Table2") :
    (isS3 ? "Table3" : "Table4");
Run Code Online (Sandbox Code Playgroud)


M Z*_*M Z 5

在这种特殊情况下,如果我们将其简化为嵌套的 if 语句,可能会更合乎逻辑地理解:

if (date == current_date) {
  if (source === "s3") {
    table_name = "Table1";
  } else {
    table_name = "Table2";
  }
} else {
  if (source === "s3") {
    table_name = "Table3";
  } else {
    table_name = "Table4";
  }
}
Run Code Online (Sandbox Code Playgroud)

确实最多进行 2 次逻辑比较并改用程序控制,同时实现相同的逻辑结果,而您的最多需要...... 8?

但在这一点上,它主要是一个挑剔的风格问题,评论中有一些好主意。例如,如果您期望此逻辑增长,则使用地图/对象来存储此信息会更有意义。

是的,switch 语句没有多大意义。