重构切换语句,它取决于正在定义的父对象

时间:2018-05-16 17:35:27

标签: javascript refactoring

我只是想知道是否有更好的方法在Javascript中编写它(特别是删除if语句)。

that.conflicts_selected {text: "All Locations", value: "all"}

形式的对象

但是,有时候.conflicts_selected可以为null,这就是if语句的原因。

        if (that.conflicts_selected) {
          switch (that.conflicts_selected.value) {
            case "all":
              return true;
            case "with":
              return (someValue > 0)
            case "without":
              return (someValue === 0)
          }
        }

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:4)

您可以使用功能强大的&&运算符:

switch (that.conflicts_selected && that.conflicts_selected.value) {
  case "all":
    return true;
  case "with":
    return (someValue > 0)
  case "without":
    return (someValue === 0)
}

that.conflicts_selected && that.conflicts_selected.value的评估如下:

  • 评估左侧(that.conflicts_selected
    • 如果结果值为 falsy nullundefined0""NaN,或者当然,false)整个&&表达式将该值作为结果。
    • 如果左侧的结果值是 truthy (任何非假的值),则评估右侧(that.conflicts_selected.value)并{{1} } expression将其作为结果。

这意味着它会在错误的情况下发生短路,因此如果&&that.conflicts_selected,则在null上尝试访问属性(value)时不会出错{1}}(null)。

评估that.conflicts_selected值(switch)后,会根据that.conflicts_selected && that.conflicts_selected.value标签进行检查。与具有类似语法的其他语言不同,case标签不必是常量,它们可以是表达式(尽管它们在此示例中是常量,但它们是字符串文字)。评估源代码顺序中的第一个case标签,并使用严格(case)比较将其结果与switch值进行比较,如果匹配===的陈述被执行;如果没有,则评估和比较下一个case标签,等等。如果它们都不匹配且有case,则执行其语句;如果没有default,则default'switch中的语句不会被执行。

当你第一次开始使用JavaScript时,这看起来有些奇怪,但它是一个你很快习惯的成熟习惯。

答案 1 :(得分:1)

解决它的一种方法也很容易扩展,就是使用一个对象。

const valueEvaluators {
    all: val => true,
    with: val => val > 0,
    without: val => val === 0
}

return that.conflicts_selected && valueEvaluators[that.conflicts_selected.value](someValue)