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

Истомин Сергей #116

Open
wants to merge 14 commits into
base: master
Choose a base branch
from
15 changes: 15 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
root = true

[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
indent_size = 4
indent_style = space
trim_trailing_whitespace = true

[*.json]
indent_size = 2

[*.md]
trim_trailing_whitespace = false
3 changes: 3 additions & 0 deletions .eslintrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"extends": "hrundel/node"
}
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
.idea
/node_modules
*.log
2 changes: 2 additions & 0 deletions .npmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
save=true
save-exact=true
3 changes: 3 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
language: node_js
node_js:
- "6"
70 changes: 69 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,69 @@
# javascript-task-2
# Задача «Телефонная книга»

Перед выполнением задания внимательно прочитайте:

- [О всех этапах проверки задания](https://github.com/urfu-2016/guides/blob/master/workflow/extra.md)
- [Как отправить пулл](https://github.com/urfu-2016/guides/blob/master/workflow/pull.md)
- [Как пройти тесты](https://github.com/urfu-2016/guides/blob/master/workflow/test.md)
- Правила оформления [javascript](https://github.com/urfu-2016/guides/blob/master/codestyle/js.md), [HTML](https://github.com/urfu-2016/guides/blob/master/codestyle/html.md) и [CSS](https://github.com/urfu-2016/guides/blob/master/codestyle/css.md) кода
- [Лекцию «Типы данных»](https://urfu-2016.github.io/javascript-slides/02-types/#/)


## Основное задание

> Мы очень хотим, чтобы код вы написали сами, а не пользовались внешними библиотеками.

Как известно, каждый уважающий себя разработчик должен в жизни сделать три вещи:
- [x] посадить DOM дерево
- [x] построить абстракцию
- [ ] ~~вырастить~~ написать телефонную книгу

Предлагаем вам пройти легкий путь становления уважающего себя разработчика и реализовать для скрипта телефонной книги __phone-book.js__ ряд необходимых методов.

Метод __add__ для добавления записей:
* На вход принимает «Телефон», «Имя» и «Электронную почту»
* Возвращает true или false в зависимости от успеха опереации
* Телефоны принимаются **только** в формате 5556667788 (без кода)
* Не добавляет **уже существующую** запись
* Не добавляет запись **без имени**

Метод __update__ для обновления записей:
* На вход принимает «Телефон», «Имя» и «Электронную почту»
* Обновляет «Имя» и «Электронную почту» по заданному «Телефону»
* Возвращает true или false в зависимости от успеха опереации
* «Электронную почту» можно стереть (не передав последний параметр), а «Имя» – нет

Метод __find__ для поиска записей:
* На вход принимает запрос в виде строки
* Ищет вхождение этой строки хотя бы в одно из полей «Телефон», «Имя» и «Электронную почту»
* Возвращает отсортированный по «Имени» массив строк в формате `name, phone, email`
* «Имя» и «Электронную почту» выводит как есть, а «Телефон» в формате `+7 (555) 666-77-88`
* Пустой запрос не должен ничего находить
* Запрос «*» находит все записи

Метод __findAndRemove__ для удаления записей:
* На вход принимает запрос в виде строки
* Находит (смотри __find__) и удаляет все найденные записи
* Возвращает число удаленных записей

В файле _index.js_ вы можете найти примеры использования получившегося скриптика.

## Дополнительное задание

> Перед выполнением внимательно прочитайте [про особенности](https://github.com/urfu-2016/guides/blob/master/workflow/extra.md)

По одной добавлять записи в книгу не очень удобно, поэтому будет здорово, если вы добавите в решение импорт данных из csv. Для этого реализуйте код метода __importFromCsv__.

На вход метод принимает строку в формате csv. Если запись в телефонной книги уже есть – обновляет/дополняет её данными из csv строки. На выходе метод возвращает одно число добавленных/обновленных записей.

Пример работы этого метода вы может отыскать в _index.js_ и в тестах.

## Полезные ссылки

- [Знакомимся с массивами](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Array)
- [Пытаемся знакомиться с регулярными выражениями](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/RegExp)
- [Перебираем ключи объектов](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Object/keys)
- [Метод indexOf для строк](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/String/indexOf)
- [Метод slice для строк](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/String/slice)

<img width="1279" alt="Позвони мне, позвони" src="https://cloud.githubusercontent.com/assets/4534405/19268754/abd81b8c-8fcf-11e6-9cbb-6665bf84bcfa.png">
44 changes: 44 additions & 0 deletions index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
'use strict';

var phoneBook = require('./phone-book');

// Эти записи добавятся, вернется true
phoneBook.add('5554440044', 'Григорий', '[email protected]');
phoneBook.add('5552220022', 'Борис', '[email protected]');
phoneBook.add('5551110011', 'Алекс');
phoneBook.add('5553330033', 'Валерий', '[email protected]');

// Эти запись не добавятся
phoneBook.add('3330033', 'Неизвестный', '[email protected]');
phoneBook.add('5551110011', 'Алексей');
phoneBook.add('5555550055');

// Обновление
phoneBook.update('5551110011', 'Алексей', '[email protected]');
phoneBook.update('5553330033', 'Валерий');

// В следующих примерах вернутся все записи
console.info(phoneBook.find('*'));
console.info(phoneBook.find('555'));
// Вывод будет следующий
// [
// 'Алексей, +7 (555) 111-00-11, [email protected]',
// 'Борис, +7 (555) 222-00-22, [email protected]',
// 'Валерий, +7 (555) 333-00-33',
// 'Григорий, +7 (555) 444-00-44, [email protected]'
// ]

// Удаление
phoneBook.findAndRemove('@'); // returns 3

if (phoneBook.isStar) {
// Импортируем из csv
var csv = [
'Борис;5552220022;[email protected]',
'Григорий;5554440044;[email protected]',
'Алексей;5551110011;[email protected]',
'Валерий;5553330033;[email protected]',
'Неизвестный;3330033;[email protected]'
].join('\n');
phoneBook.importFromCsv(csv); // returns 4
}
13 changes: 13 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{
"private": true,
"main": "phone-book.js",
"scripts": {
"lint": "eslint .",
"test": "eslint . && mocha *.spec.js"
},
"dependencies": {
"eslint": "3.7.0",
"eslint-config-hrundel": "latest",
"mocha": "3.1.0"
}
}
Loading