Валидаторы нужны для валидации. Давайте ради забавы забудем об этом. Давайте с помощью валидатора пройдёмся по вложенной структуре данных. Сумасшествие, скажете вы!
Давайте бежать по телефонной книге:
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;
}
Вот такую забаву я придумал в Воскресение вечером. А что странного приходит в вашу голову? Напишите в комментах.
Все публикации в потоке Разработка
Apple возобновила переговоры с OpenAI о возможности внедрения ИИ-технологий в iOS 18, на основе данной операционной системы будут работать новые…
Конкурсный управляющий российской «дочки» Google подготовил 23 иска к участникам рекламного рынка. Общая сумма исков составляет 16 млрд рублей –…
Google завершил обновление основного алгоритма March 2024 Core Update. Раскатка обновлений была завершена 19 апреля, но сообщил об этом поисковик…
У частных продавцов на Авито появилась возможность составлять текст объявлений с помощью нейросети. Новый функционал доступен в категории «Обувь, одежда,…
24 апреля 2024 года в Москве состоялась церемония вручения наград международного конкурса Workspace Digital Awards. В этом году участниками стали…
27 июня Яндекс проведет гик-фестиваль Young Con для студентов и молодых специалистов, которые интересуются технологиями и хотят работать в IT.…