-
Notifications
You must be signed in to change notification settings - Fork 16
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
base: master
Are you sure you want to change the base?
Дюкин Петр js-2 #18
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
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; | ||
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; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 1 балл |
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; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 1 балл |
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; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 1 балл |
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; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 1 балл |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
1 балл