DevGang
Авторизоваться

Использование Array.Reduce для упрощения проверки объектов в JavaScript

Проверка объектов в JavaScript может быть утомительной, если у вас нет хорошей платформы. В этом посте мы будем использовать метод Array.reduce, чтобы валидация объекта выглядела как удовольствие!

Ручные проверки

Допустим, у нас есть объект user и несколько критериев, которые необходимо пройти, чтобы сделать его действительным. Вот свойства и критерии, которым он должен соответствовать:

  • name - Длиннее 2 символов
  • password - Длиннее 8 символов
  • confirmPassword - Совпадает с паролем
  • age - 18 или больше

Если бы мы применили ручной подход к валидации, мы могли бы написать что-то вроде этого:

const user = {
  name: "Bob",
  password: "kaBob123",
  confirmPassword: "kaBob123",
  age: 19,
};

const errors = [];

if (user.name.length < 2) {
  errors.push("User's name is too short");
}

if (user.password.length < 8) {
  errors.push("User's password is too short");
}

if (user.password !== user.confirmPassword) {
  errors.push("Password and confirmation do not match");
}

if (user.age < 18) {
  errors.push("User must be at least 18 years old");
}

const isValid = errors.length === 0;

Наш массив errors будет заполнен любыми ошибками проверки и, если длина массива будет больше 0, наша переменная isValid будет false.

Создание структуры проверки

Хотя для небольшого числа проверок это хорошо работает, я предпочитаю организовывать в массиве большие наборы правил и использовать метод reduce для определения наличия ошибок:

// Validation rules
const rules = [
  {
    test: (user) => user.name.length > 2,
    message: "User's name is too short",
  },
  {
    test: (user) => user.password.length >= 8,
    message: "User's password is too short",
  },
  {
    test: (user) => user.password === user.confirmPassword,
    message: "Password and confirmation do not match",
  },
  {
    test: (user) => user.age >= 18,
    message: "User must be at least 18 years old",
  },
];

// Test object against rules
const errors = rules.reduce((errs, rule) => {
  const result = rule.test(user);
  if (result === false) {
    errs.push(rule.message);
  }
  return errs;
}, []);

const isValid = errors.length === 0;

Теперь у нас есть согласованный интерфейс, и мы можем добавлять правила, просто добавляя дополнительные объекты в наш массив!

Создание повторно используемой функции проверки

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

const validate = (obj, rules) => {
  const errors = rules.reduce((errs, rule) => {
    const result = rule.test(obj);
    if (result === false) {
      errs.push(rule.message);
    }
    return errs;
  }, []);

  return {
    errors,
    isValid: errors.length === 0
  }
}

Теперь мы можем использовать эту функцию везде, где нам нужно проверить объект! Давайте попробуем с нашим предыдущим примером и используем объект пользователя, который не совсем корректен:

// Invalid user object
const user = {
  name: "Bob",
  password: "kaBob123",
  confirmPassword: "kaBob12",
  age: 17,
};

// Validation rules
const rules = [
  {
    test: (user) => user.name.length > 2,
    message: "User's name is too short",
  },
  {
    test: (user) => user.password.length >= 8,
    message: "User's password is too short",
  },
  {
    test: (user) => user.password === user.confirmPassword,
    message: "Password and confirmation do not match",
  },
  {
    test: (user) => user.age >= 18,
    message: "User must be at least 18 years old",
  },
];

// Validation function
const validate = (obj, rules) => {
  const errors = rules.reduce((errs, rule) => {
    const result = rule.test(obj);
    if (result === false) {
      errs.push(rule.message);
    }
    return errs;
  }, []);

  return {
    errors,
    isValid: errors.length === 0,
  };
};

// Testing our object
const result = validate(user, rules);

// {
//   errors:
//    [ 'Password and confirmation do not match',
//      'User must be at least 18 years old' ],
//   isValid: false
// }

Надеюсь, вам понравилось это использование Array.reduce, чтобы сделать наши проверки объектов более последовательными и приятными.

Источник:

#JavaScript
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

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

Попробовать

Освой перспективную онлайн профессию!

Получить скидку