首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多个if条件的可选方法

多个if条件的可选方法
EN

Stack Overflow用户
提问于 2020-09-02 15:45:08
回答 8查看 214关注 0票数 11

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

代码语言:javascript
复制
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";
}

我认为在这里使用switch语句是没有意义的,因为我们并不是针对开关表达式来计算case语句表达式。

那么,是否可以使用多个if better语句或任何更好的替代方法?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2020-09-02 16:14:43

您的代码是100%的好选择。它只是有点难读。您可以将通用代码提取到变量中,使其更具可读性。

代码语言:javascript
复制
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";
}

其他选项是使用三元运算符。

代码语言:javascript
复制
var isCurrent = date == current_date;
var isS3 = source === "s3";

if (isCurrent) {
    table_name = isS3 ? "Table1" : "Table2";
} else {
    table_name = isS3 ? "Table3" : "Table4";
}

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

代码语言:javascript
复制
var isCurrent = date == current_date;
var isS3 = source === "s3";

table_name = isCurrent ? 
    (isS3 ? "Table1" : "Table2") :
    (isS3 ? "Table3" : "Table4");
票数 8
EN

Stack Overflow用户

发布于 2020-09-02 15:55:00

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

代码语言:javascript
复制
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";
  }
}

这样做最多可以进行2次逻辑比较,并使用程序控制,同时实现相同的逻辑结果,而您的结果将占用更多的时间。8?

但在这一点上,这主要是一个挑选风格的问题,评论有一些好主意。例如,如果您期望这种逻辑增长,那么使用映射/对象来存储这些信息就更有意义了。

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

票数 5
EN

Stack Overflow用户

发布于 2020-09-02 16:03:01

这是我的“最过度设计的解决方案”竞赛的申请:

代码语言:javascript
复制
const bools = [
  date === current_date,
  source === "s3",
  // more?
];

const mask = bools.reduce((x, e) => x + +e, "");
// [ false, false ] --> 00
// [ true,  false ] --> 10
// [ false, true  ] --> 01
// [ true,  true  ] --> 11

switch (mask) {

  case "00":
    table_name = "Table4";
    break;

  case "01":
    table_name = "Table3";
    break;

  case "10":
    table_name = "Table2";
    break;

  case "11":
    table_name = "Table1";
    break;

  default:
    // noop
    break;

}

如果您愿意的话,这里可能是switch的另一个掩码,这次是数字的:

代码语言:javascript
复制
const mask = bools.reduce((x, e, i) => x + e * Math.pow(2, i), 0);
// [ false, false ] --> 0
// [ true,  false ] --> 1
// [ false, true  ] --> 2
// [ true,  true  ] --> 3

否则,只需使用好的ol‘ifs :)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63709001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档