替换“ ||” Javascript中的条件

时间:2019-03-05 20:00:10

标签: javascript if-statement higher-order-functions or-operator or-condition

好吧,这是我的第一个堆栈溢出帖子!

大家好,最近我在函数式编程方面学到了很多东西。我在funfunfunction上找到了一些较老的视频,这激起了我的胃口,我一直在和他们玩耍。

我的问题是…是否有更好/不同/首选的方式来重构这段代码:

if ( bodyClasses.contains("first-class") || bodyClasses.contains("second-class") || bodyClasses.contains("third-class") ) {
        pages.filter((page) => searchAndReplace( page.postType, ".selector" ));
}

我尝试使用reduce(),但很快了解到,在第一次迭代返回true时,我需要过早地中断缩减。我觉得if语句在这里很有意义,但是我很好奇。

我知道这是一小段没有上下文的代码,但是问题是关于概念而不是功能

对于任何回应的人,我先谢谢您!

2 个答案:

答案 0 :(得分:1)

当涉及到||时,可能需要将其放置在某个地方,但也许我们可以将它们藏起来。我喜欢在if子句中使用谓词,以提高可读性并创建可重用的函数。

const hasSupport = classes =>
  classes.some(cls => cls === "class1" || cls === "class2" || cls === "class3");

if (hasSupport(bodyClasses)) { ... }

要考虑的最后一部分是您的if语句中。该过滤器将返回一个新列表,但您不在任何地方存储数据。因此,如果您实际上想要一个新列表,则将其存储在变量中:

const supportedPages = hasSupport(bodyClasses) 
  ?  pages.filter(...) 
  : []

如果您想要这些副作用,请使用forEach循环:

if (hasSupport(bodyClasses) { pages.forEach(...) }

答案 1 :(得分:1)

要摆脱or,请与.some数组值匹配:

if(["first-class", "second-class", "third-class"].some(cls => bodyClasses.contains(cls)))
 /*...*/;

如果您对返回的值不做任何事情,我将不使用.filter,而只需使用.forEach