[JavaScript] Странные применения валидации
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
Валидаторы нужны для валидации. Давайте ради забавы забудем об этом. Давайте с помощью валидатора пройдёмся по вложенной структуре данных. Сумасшествие, скажете вы!
По чём бежать будем?
Давайте бежать по телефонной книге:
const phoneBook = {
andrew: ["+345356245254", "+313232312312"],
vasilina: ["+132313123123"],
serhiy: ["+587234878234", "+321323124123"],
};
Что хотим получить?
Давайте получим список всех номеров.
Как мы это сделаем?
Мы сделаем это в 4 шага:
- Подключим библиотеку для валидации данных
- Создадим обычную функцию валидации
- Добавим побочный эффект собирания номеров в массив
- Обернём в функцию
Будем использовать библиотеку валидации quartet:
import { v } from "quartet";
Напишем функцию валидации:
const checkPhoneBook = v({
[v.rest]: v.arrayOf(v.string),
});
Теперь мы можем проверить, является ли некое значение телефонной книгой:
checkPhoneBook({}); // true
checkPhoneBook({ andrew: ["123321"] }); // true
checkPhoneBook({ andrew: null }); // false
Теперь добавим немного сумасшествия: проверяя элемент списка номеров будем его добавлять в массив.
const phoneNumbers = [];
const checkAndCollect = v({
[v.rest]: v.arrayOf(
v.and(
v.string,
v.custom((phoneNumber) => {
phoneNumbers.push(phoneNumber);
return true;
})
)
),
});
Вызовем эту функцию валидации на конкретной телефонной книге:
checkAndCollect({
andrew: ["+345356245254", "+313232312312"],
vasilina: ["+132313123123"],
serhiy: ["+587234878234", "+321323124123"],
});
Вернулось true. Но нас это не интересует! Главное: в массиве phoneNumbers теперь хранятся все номера.
console.log(phoneNumbers);
// [
// '+345356245254',
// '+313232312312',
// '+132313123123',
// '+587234878234',
// '+321323124123'
// ]
Обернём это в функцию для «переиспользования»:
import { v } from "quartet";
/**
* @param {Record<string, string[]>} phoneBook
* @returns {string[]} phone numbers
*/
function collectPhoneNumbers(phoneBook) {
const phoneNumbers = [];
const checkAndCollect = v({
[v.rest]: v.arrayOf(
v.and(
v.string,
v.custom((phoneNumber) => {
phoneNumbers.push(phoneNumber);
return true;
})
)
),
});
checkAndCollect(phoneBook);
return phoneNumbers;
}
Оценка
Использование таких трюков может быть забавным. Но я бы не писал так в production коде. И по трём причинам:
- Это не оптимальное решение по скорости работы. Создание функции валидации для итерации по книге номеров — лишнее действие.
- Это не идиоматический код. Библиотека валидации не предназначена для итераций.
- Есть код более подходящий для этой задачи:
/**
* @param {Record<string, string[]>} phoneBook
* @returns {string[]} phone numbers
*/
function collectPhoneNumbers(phoneBook) {
const phoneNumbers = [];
const personNames = Object.keys(phoneBook);
for (const personName of personNames) {
const personPhoneNumbers = phoneBook[personName];
phoneNumbers.push(...personPhoneNumbers);
}
return phoneNumbers;
}
Послесловие
Вот такую забаву я придумал в Воскресение вечером. А что странного приходит в вашу голову? Напишите в комментах.
===========
Источник:
habr.com
===========
Похожие новости:
- [Программирование, Java, Amazon Web Services, Gradle, Облачные сервисы] Если у вас не работает Spring BootJar
- [Разработка веб-сайтов, JavaScript, VueJS, TypeScript] Какой будет новая версия Vuex? (перевод)
- [Разработка веб-сайтов, Open source, JavaScript, ReactJS, TypeScript] Что выбрать в качестве библиотеки компонентов для React-проекта
- [Ruby, Oracle, Python, JavaScript, Java] Опыт сопряжения Java, JavaScript, Ruby и Python в одном проекте посредством GraalVM
- [Программирование, ReactJS] Создание React-компонентов с помощью Hygen (перевод)
- [JavaScript, Google Chrome, Расширения для браузеров, Хранение данных, Хранилища данных] Использование Redux в MV3 расширениях Chrome (перевод)
- [Разработка веб-сайтов, JavaScript, Программирование, ReactJS] Вопросы для собеседования по хукам React (перевод)
- [Разработка веб-сайтов, JavaScript, Программирование, ReactJS] Заметка о том, как React обновляет состояние (перевод)
- [Angular, ReactJS] Считаем code сoverage с cypress
- [JavaScript, Геоинформационные сервисы, WebGL] Особенности масштабирования WebGL-карты
Теги для поиска: #_javascript, #_iteration, #_validation, #_js, #_quartet, #_javascript
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 23:49
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
Валидаторы нужны для валидации. Давайте ради забавы забудем об этом. Давайте с помощью валидатора пройдёмся по вложенной структуре данных. Сумасшествие, скажете вы! По чём бежать будем? Давайте бежать по телефонной книге: const phoneBook = {
andrew: ["+345356245254", "+313232312312"], vasilina: ["+132313123123"], serhiy: ["+587234878234", "+321323124123"], }; Что хотим получить? Давайте получим список всех номеров. Как мы это сделаем? Мы сделаем это в 4 шага:
Будем использовать библиотеку валидации quartet: import { v } from "quartet";
Напишем функцию валидации: const checkPhoneBook = v({
[v.rest]: v.arrayOf(v.string), }); Теперь мы можем проверить, является ли некое значение телефонной книгой: checkPhoneBook({}); // true
checkPhoneBook({ andrew: ["123321"] }); // true checkPhoneBook({ andrew: null }); // false Теперь добавим немного сумасшествия: проверяя элемент списка номеров будем его добавлять в массив. const phoneNumbers = [];
const checkAndCollect = v({ [v.rest]: v.arrayOf( v.and( v.string, v.custom((phoneNumber) => { phoneNumbers.push(phoneNumber); return true; }) ) ), }); Вызовем эту функцию валидации на конкретной телефонной книге: checkAndCollect({
andrew: ["+345356245254", "+313232312312"], vasilina: ["+132313123123"], serhiy: ["+587234878234", "+321323124123"], }); Вернулось true. Но нас это не интересует! Главное: в массиве phoneNumbers теперь хранятся все номера. console.log(phoneNumbers);
// [ // '+345356245254', // '+313232312312', // '+132313123123', // '+587234878234', // '+321323124123' // ] Обернём это в функцию для «переиспользования»: import { v } from "quartet";
/** * @param {Record<string, string[]>} phoneBook * @returns {string[]} phone numbers */ function collectPhoneNumbers(phoneBook) { const phoneNumbers = []; const checkAndCollect = v({ [v.rest]: v.arrayOf( v.and( v.string, v.custom((phoneNumber) => { phoneNumbers.push(phoneNumber); return true; }) ) ), }); checkAndCollect(phoneBook); return phoneNumbers; } Оценка Использование таких трюков может быть забавным. Но я бы не писал так в production коде. И по трём причинам:
/**
* @param {Record<string, string[]>} phoneBook * @returns {string[]} phone numbers */ function collectPhoneNumbers(phoneBook) { const phoneNumbers = []; const personNames = Object.keys(phoneBook); for (const personName of personNames) { const personPhoneNumbers = phoneBook[personName]; phoneNumbers.push(...personPhoneNumbers); } return phoneNumbers; } Послесловие Вот такую забаву я придумал в Воскресение вечером. А что странного приходит в вашу голову? Напишите в комментах. =========== Источник: habr.com =========== Похожие новости:
|
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 23:49
Часовой пояс: UTC + 5