Замена "||"Условные в Javascript - PullRequest
0 голосов
/ 05 марта 2019

Ну, вот мой первый пост переполнения стека!

Привет всем, я недавно много узнал о функциональном программировании. Я нашел несколько старых видео на 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 ]

1 голос
/ 05 марта 2019

Чтобы убрать или, сравните с .some значениями массива:

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

и я бы не стал использовать .filter, если вы ничего не делаете с возвращаемыми значениями, тогда просто используйте .forEach.

1 голос
/ 05 марта 2019

Когда дело доходит до этого, ||, вероятно, должно быть где-то, но, может быть, мы можем их убрать. Мне нравится использовать предикаты в моих предложениях 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(...) }
...