diff --git a/src/task_1/index.js b/src/task_1/index.js index 966f6fc..1098627 100644 --- a/src/task_1/index.js +++ b/src/task_1/index.js @@ -1,25 +1,38 @@ -/** Задача 1 - Функция add -Требуется написать функцию add, которая -принимает: - 1) Текущее состояние телефонной книги - 2) Номер телефон - 3) Имя - 4) Электронную почту, -требуется: -в текущее состояние телефонной книги добавить новый контакт по правилам - 1) Телефоны принимаются только в форматах +7-999-111-22-33 или +79991112233 - 2) Не добавляется уже существующая запись - 3) Не добавляется запись без имени -возвращает: - true - если добавление прошло успешно - false - если запись не создалась или не добавилась в книгу -@param {Array<{ phone: string, name: string, email?: string }>} phoneBook - Текущее состояние телефонной книги -@param {string} phone Номер телефона -@param {string} name Имя -@param {string} email Электронная почта -@returns {boolean} Результат добавления - */ +function toFormat(phone) { + return phone.match(/\d/g).join(''); +} + +function isEmpty(name) { + if (name !== null && typeof name !== "undefined") + name = name.trim(); + return !Boolean(name); +} + +function contains(objectsArray, property, value) { + for (let obj of objectsArray) + if (toFormat(obj[property]) === toFormat(value)) + return true; + return false; +} + +function templateCheck(phone) { + let firstTemplate = /^\+7-\d\d\d-\d\d\d-\d\d-\d\d$/; + let secondTemplate = /^\+7\d\d\d\d\d\d\d\d\d\d$/; + return firstTemplate.test(phone) || secondTemplate.test(phone); +} + function add(phoneBook, phone, name, email) { + if (isEmpty(name) || contains(phoneBook, "phone", phone) || !templateCheck(phone)) + return false; + phoneBook.push({ + name : name, + phone : phone, + email : email + }) + return true; } module.exports.add = add; +module.exports.toFormat = toFormat; +module.exports.isEmpty = isEmpty; +module.exports.templateCheck = templateCheck; \ No newline at end of file diff --git a/src/task_2/index.js b/src/task_2/index.js index a5ad6b9..01e1048 100644 --- a/src/task_2/index.js +++ b/src/task_2/index.js @@ -1,24 +1,21 @@ -/** Задача 2 - Функция update -Требуется написать функцию update, которая -принимает: - 1) Текущее состояние телефонной книги - 2) Номер телефон - 3) Имя - 4) Электронную почту, -требуется: -в текущем состояние телефонной книги обновить контакт по номеру телефона - 1) Электронную почту можно стереть, а имя нет - 2) Правила валидации полей такое же, как и при добавлении -возвращает: - true - если обновление прошло успешно - false - если запись не обновилась -@param {Array<{ phone: string, name: string, email?: string }>} phoneBook - Текущее состояние телефонной книги -@param {string} phone Номер телефона -@param {string} name Имя -@param {string} email Электронная почта -@returns {boolean} Результат обновления - */ +const {templateCheck} = require("../task_1"); +const {toFormat} = require("../task_1"); +const {isEmpty} = require("../task_1"); + +function find(objectsArray, property, value) { + for (let obj of objectsArray) + if (toFormat(obj[property]) === toFormat(value)) + return obj; + return null; +} + function update(phoneBook, phone, name, email) { + let item = find(phoneBook, "phone", phone) + if (isEmpty(name) || item === null || typeof item === "undefined" || !templateCheck(phone)) + return false; + item.name = name; + item.email = email; + return true; } -module.exports.update = update; +module.exports.update = update; \ No newline at end of file diff --git a/src/task_3/index.js b/src/task_3/index.js index 67fd3cf..04f4887 100644 --- a/src/task_3/index.js +++ b/src/task_3/index.js @@ -1,24 +1,40 @@ -/** Задача 2 - Функция find -Требуется написать функцию find, которая -принимает: - 1) Текущее состояние телефонной книги - 2) Запрос для поиска -требуется: -в текущем состоянии телефонной книги найти все записи, которые удовлетворяют требованиям - 1) Одно из полей name, email содержит подстроку поиска - 2) Поиск по полю phone проводится по следующим правилам: - 2.1) При запросе +7-800-555-35-35 должны отображаться записи с номерами +7-800-555-35-35 и +78005553535 - 2.2) При запросе +78005553535 должны отображаться записи с номерами +78005553535 и +7-800-555-35-35 - 2) Пустой запрос не должен ничего находить - 3) Запрос «*» находит все записи -возвращает: - Отсортированный по полю name массив строк в формате name, phone, email - Поле phone должно быть отформатировано в виде +7 (999) 111-22-33 -@param {Array<{ phone: string, name: string, email?: string }>} phoneBook - Текущее состояние телефонной книги -@param {string} query Строка для поиска -@returns {Array} Результаты поиска - */ +const {isEmpty} = require("../task_1"); +const {toFormat} = require("../task_1"); + +function templatePhone(phone) { + let parts = []; + let index = 1; + for (let partLen of [3,3,2,2]) { + parts.push(phone.substr(index, partLen)); + index += partLen; + } + return `+7 (${parts[0]}) ${parts[1]}-${parts[2]}-${parts[3]}`; +} + +function getResult (phoneBook) { + let result = []; + phoneBook = phoneBook.sort((a, b) => a.name > b.name ? 1 : -1); + for (let item of phoneBook) { + let phone = toFormat(item.phone); + phone = templatePhone(phone); + if (typeof item.email === "undefined") result.push(`${item.name} ${phone}`) + else result.push(`${item.name} ${phone} ${item.email}`); + } + return result; +} + function find(phoneBook, query) { + if (isEmpty(query)) return; + if (query === "*") return getResult(phoneBook); + let result = []; + for (let obj of phoneBook) + for (let prop in obj) + if (prop === "phone" && /[0-9]/.test(query) + && toFormat(obj[prop]).indexOf(toFormat(query)) !== -1) + result.push(obj); + else if (typeof obj[prop] !== "undefined" && obj[prop].indexOf(query) !== -1) + result.push(obj); + return getResult(result); } -module.exports.find = find; +module.exports.find = find; \ No newline at end of file diff --git a/src/task_4/index.js b/src/task_4/index.js index c769ecd..ce484f6 100644 --- a/src/task_4/index.js +++ b/src/task_4/index.js @@ -1,18 +1,39 @@ -/** Задача 2 - Функция findAndRemove -Требуется написать функцию findAndRemove, которая -принимает: - 1) Текущее состояние телефонной книги - 2) Запрос для поиска -требуется: -в текущем состоянии телефонной книги найти и удалить все записи, которые удовлетворяют требованиям - 1) См. find из task_3 -возвращает: - Число удаленных записей -@param {Array<{ phone: string, name: string, email?: string }>} phoneBook - Текущее состояние телефонной книги -@param {string} query Строка для поиска -@returns {number} Количество удаленных записей - */ +const {isEmpty} = require("../task_1"); +const {toFormat} = require("../task_1"); + +function remove(arr, indexes) { + let count = 0; + indexes = indexes.sort((a, b) => a < b ? 1 : -1); + for (let index of indexes) { + arr.splice(index, 1); + count++; + } + return count; +} + +function contains(item1, item2) { + let result = false; + if (/[0-9]/.test(item1) && /[0-9]/.test(item2)) + if (toFormat(item1).indexOf(toFormat(item2)) !== -1) + result = true; + return result || item1.indexOf(item2) !== -1; +} + function findAndRemove(phoneBook, query) { + let indexes = []; + if (isEmpty(query)) return 0; + if (query === "*") { + let count = phoneBook.length; + phoneBook = []; + return count; + }; + for (let i = 0; i < phoneBook.length; i++) + for (let prop in phoneBook[i]) + if (typeof phoneBook[i][prop] !== "undefined" && contains(phoneBook[i][prop], query)) { + indexes.push(i); + break; + } + return remove(phoneBook, indexes); } -module.exports.findAndRemove = findAndRemove; +module.exports.findAndRemove = findAndRemove; \ No newline at end of file diff --git a/src/task_5/index.js b/src/task_5/index.js index a775bd0..b94a843 100644 --- a/src/task_5/index.js +++ b/src/task_5/index.js @@ -1,17 +1,18 @@ -/** Задача 2 - Функция importFromCsv -Требуется написать функцию importFromCsv, которая -принимает: - 1) Текущее состояние телефонной книги - 2) Строку в формате csv -требуется: -в текущем состоянии телефонной книги обновить записи или добавить их в зависимости от того, существуют они или нет -возвращает: - Число обновленных и добавленных записей -@param {Array<{ phone: string, name: string, email?: string }>} phoneBook - Текущее состояние телефонной книги -@param {string} csv Csv строка, описывающая таблицу, формата name;phone;email -@returns {number} Количество добавленных и обновленных записей - */ +const {toFormat} = require("../task_1"); +const {update} = require("../task_2"); +const {add} = require("../task_1"); + function importFromCsv(phoneBook, csv) { + csv = csv.split(["\n"]); + let count = 0; + for (let string of csv) { + let items = string.split(";"); + if (items.length !== 3 || String(toFormat(items[0])).length !== 11) + continue; + if (add(phoneBook, items[0], items[1], items[2])) count++; + else if (update(phoneBook, items[0], items[1], items[2])) count++; + } + return count; } -module.exports.importFromCsv = importFromCsv; +module.exports.importFromCsv = importFromCsv; \ No newline at end of file