Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Дюкин Петр js-2 #18

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 34 additions & 21 deletions src/task_1/index.js
Original file line number Diff line number Diff line change
@@ -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;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1 балл

39 changes: 18 additions & 21 deletions src/task_2/index.js
Original file line number Diff line number Diff line change
@@ -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;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1 балл

58 changes: 37 additions & 21 deletions src/task_3/index.js
Original file line number Diff line number Diff line change
@@ -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<string>} Результаты поиска
*/
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;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1 балл

51 changes: 36 additions & 15 deletions src/task_4/index.js
Original file line number Diff line number Diff line change
@@ -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;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1 балл

29 changes: 15 additions & 14 deletions src/task_5/index.js
Original file line number Diff line number Diff line change
@@ -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;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1 балл