优化if-else的使用,你需要更好的选择结构!

2025-05-27

优化if-else的使用,你需要更好的选择结构!

不知道大家有没有遇到过像金字塔一样水平摆放的if-else嵌套的情况:

if (true) {
}

if (true) {
}

if (true) {
  if (true) {
    if (true) {
    }
  } else {
  }
} else {
}
Enter fullscreen mode Exit fullscreen mode

如果一段代码中if-else过多,代码的可读性就会迅速下降,后期维护代码也会变得非常困难。接下来我就讲讲如何去除它们。

条件运算符

对于更简单的 if-else 语句,可以很容易地将它们重写为条件运算符:

// Bad 😥
if (true) {
  console.log("Congratutions!")
} else {
  console.warn("Oops, something went wrong!")
}

// Great 🥰
true 
  ? console.log("Congratutions")
  : console.warn("Oops, something went wrong!")
Enter fullscreen mode Exit fullscreen mode

当然,在这一点上,两者的差别还没有那么大。

逻辑与运算符

如果您只是想在满足某个条件时执行某个函数,那么您可以使用逻辑与运算符:

if (true) {
  alert(1)
}

// is equals to:

true && alert(1)
Enter fullscreen mode Exit fullscreen mode

它的使用条件非常严格,只能执行函数,不能使用任何语句,包括“return”。虽然这并不能让代码看起来更合乎逻辑,但在某些情况下还是很有用的。

提前回报

由@Edenn Touitou@Infinite Table提及

只需根据条件的复杂性对其进行排序并每次返回:

function handleRequest(req) {
  if (req.code >= 500) {
    return "Server error";
  }
  if (req.code >= 404) {
    return "Cilent error";
  }
  return "Suceess";
}
Enter fullscreen mode Exit fullscreen mode

表驱动方法

对于如下代码,我们通常会使用 switch 语句。但这并非最佳方案,而且如果忘记添加 break; ,代码运行结果可能会超出预期,而且 switch 语句也不太优雅。

// Bad 😥
const weekday = (num) => {
  if (num === 1) {
    return "Monday"
  } else if (num === 2) {
    return "Tuesday"
  } else if (num === 3) {
    return "Wednesday"
  } else if (num === 4) {
    return "Thursday"
  } else if (num === 5) {
    return "Friday"
  } else if (num === 6) {
    return "Saturday"
  } else if (num === 7) {
    return "Sunday"
  } else {
    return "Unknown"
  }
}

console.log(weekday(1)) // Monday
Enter fullscreen mode Exit fullscreen mode

现在是使用表驱动方法的时候了:

// Great 🥰
const weekday = (option) => {
    let obj = {
        1: "Monday",
        2: "Tuesday",
        3: "Wednesday",
        4: "Thursday",
        5: "Friday",
        6: "Saturday",
        0: "Sunday"
    }
    return obj[option] ?? "Unknown"
}

console.log(weekday(1)) // Monday
Enter fullscreen mode Exit fullscreen mode

或者你可以使用 ES6 的 Map:

// Great 🥰
const weekday = (num) => {
  const map = new Map()
    .set(1, "Monday")
    .set(2, "Tuesday")
    .set(3, "Wednesday")
    .set(4, "Thursday")
    .set(5, "Friday")
    .set(6, "Saturday")
    .set(7, "Sunday");
  return map.has(num) ? map.get(num) : "Unknown";
};

console.log(weekday(1));
Enter fullscreen mode Exit fullscreen mode

数组的 include 方法

上一节我们讨论了如何优化一对一的选择结构,这里我们讨论如何优雅地实现一对多的选择结构。

例如以下脚本:

const getContinent = (option) => {
  if (option === "China" || option === "Japan") {
    return "Asia";
  }
  if (option === "Germany" || option === "France") {
    return "Europe";
  }
};

console.log(getContinent("China"));
Enter fullscreen mode Exit fullscreen mode

现在看起来还不错,因为我还没有添加所有国家。这当然是可以优化的,而且可以通过使用数组的 include 方法轻松避免:

const getContinent = (option) => {
  const Asia = ["China", "Japan"];
  const Europe = ["Germany", "Franch"];
  if (Asia.includes(option)) return "Asia";
  if (Europe.includes(option)) return "Europe";
  return "Unknown";
};

console.log(getContinent("China")); // Asia
Enter fullscreen mode Exit fullscreen mode

经过此优化后,即使添加更多国家/地区,代码也不会变得混乱。但它还可以变得更好:

const getContinent = (option) => {
  let [result, setResult] = ["unknown", (str) => (result = str)];
  const Asia = ["China", "Japan"];
  const Europe = ["Germany", "Franch"];
  Asia.includes(option) && setResult("Asia");
  Europe.includes(option) && setResult("Europe");
  return result;
};

console.log(getContinent("China"));

Enter fullscreen mode Exit fullscreen mode

结论

通过本文,我们学习了如何在代码中减少 if-else 语句。如果您觉得这篇文章对您有帮助,请分享给您的朋友们;如果您有任何意见,也请随时留言🙂。

文章来源:https://dev.to/akarachen/reduce-the-use-of-if-else-nesting-you-need-a-better-selective-struct-32ce
PREV
网页设计简单指南
NEXT
成为全栈开发人员 - 第 0 部分:决策、计划、例程