Задать вопрос
@FrelFrloich

Как облагородить/сократить данный свитч?

Добрый день, пишу валидатор формы, так скажем для саморазвития, мой камень преткновения это длинное условие, как возможно его сделать более лаконично.

consentCheckbox = это чекбокс (аля соглашение), в какой то форме он есть, а в другой может и не быть
mailArr = массив всех инпутов с типом mail которые не прошли проверку что это почта (нет символа @ и т.п.)
inputEmptyArr = массив всех инпутов которые пусты
btnSubmite = кнопка валидации, которой я задаю класс исходя из условий

switch (consentCheckbox) {
    case null:
        let arrInput = [!mailArr.length, !inputEmptyArr.length]
        switch (arrInput.every((x) => x === true)) {
            case true:
                btnSubmite.classList.add('valid-success')
                break
            default:
                btnSubmite.classList.remove('valid-success')
                break
        }
        break

    default:
        let arrInputChecked = [!mailArr.length, !inputEmptyArr.length, consentCheckbox.checked]
        switch (arrInputChecked.every((x) => x === true)) {
            case true:
                btnSubmite.classList.add('valid-success')
                break
            default:
                btnSubmite.classList.remove('valid-success')
                break
        }

        break
}
  • Вопрос задан
  • 79 просмотров
Подписаться 1 Простой 1 комментарий
Решения вопроса 5
delphinpro
@delphinpro Куратор тега JavaScript
frontend developer
Вот эта хренотень
switch (arrInput.every((x) => x === true)) {
            case true:
                btnSubmite.classList.add('valid-success')
                break
            default:
                btnSubmite.classList.remove('valid-success')
                break
        }

заменяется одной строкой
btnSubmite.classList.toggle('valid-success', arrInput.every((x) => x === true);
Ответ написан
Комментировать
sergiks
@sergiks Куратор тега JavaScript
♬♬
Овер-сократить можно примерно так:
const checkArr = [!mailArr.length, !inputEmptyArr.length];
if (consentCheckbox) {
  checkArr.push(consentCheckbox.checked);
}
btnSubmite.classList.toggle('valid-success', !checkArr.some(x => !x));

В двух версиях массив отличается наличием последнего элемента .checked
Разницу - в if()

every(=== true) логически равноценно !some(=== false) – интересует, есть ли хоть один false.

Итого всех макарон – добавить или удалить класс.
Ответ написан
yarkov
@yarkov Куратор тега JavaScript
Помог ответ? Отметь решением.
Вложенные свичи прекрасно тернарником заменятся
Ответ написан
Комментировать
develx
@develx
Web developer
const arrInput = (consentCheckbox === null)
  ? [!mailArr.length, !inputEmptyArr.length]
  : [!mailArr.length, !inputEmptyArr.length, consentCheckbox.checked];

btnSubmite.classList.toggle('valid-success', arrInput.every((x) => x === true));


только для toggle() force параметр IE не поддерживает (если вдруг есть такая необходимость) https://caniuse.com/mdn-api_domtokenlist_toggle_fo...
если нужна поддержка IE, то toggle заменить на if else или тернарник с вызовами classList.add и classList.remove
Ответ написан
Комментировать
Убрать switch вообще и использовать вместо него if.
Осмысленные действия распихать по функциям.

Вместо этого эзотерического
let arrInput = [!mailArr.length, !inputEmptyArr.length]
arrInput.every((x) => x === true)

Писать что-то типа
if(mailArr.length === 0 && emptyInputArr.length === 0)

Да, менее компактно, но более читабельно.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы