From 9ff3ddc498fb9a04a141e3bd12d8eba718cf9ea1 Mon Sep 17 00:00:00 2001 From: Sergey Gogolev Date: Tue, 11 Oct 2016 17:53:02 +0500 Subject: [PATCH 01/14] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .editorconfig | 15 ++++++++++ .eslintrc.json | 3 ++ .gitignore | 3 ++ .npmrc | 2 ++ .travis.yml | 3 ++ README.md | 68 +++++++++++++++++++++++++++++++++++++++++++++- index.js | 44 ++++++++++++++++++++++++++++++ package.json | 13 +++++++++ phone-book.js | 62 ++++++++++++++++++++++++++++++++++++++++++ phone-book.spec.js | 61 +++++++++++++++++++++++++++++++++++++++++ 10 files changed, 273 insertions(+), 1 deletion(-) create mode 100644 .editorconfig create mode 100644 .eslintrc.json create mode 100644 .gitignore create mode 100644 .npmrc create mode 100644 .travis.yml create mode 100644 index.js create mode 100644 package.json create mode 100644 phone-book.js create mode 100644 phone-book.spec.js diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..936d024 --- /dev/null +++ b/.editorconfig @@ -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 diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..db814bf --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": "hrundel/node" +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0d48db5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.idea +/node_modules +*.log diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..f5357d5 --- /dev/null +++ b/.npmrc @@ -0,0 +1,2 @@ +save=true +save-exact=true diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..4909f83 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,3 @@ +language: node_js +node_js: + - "6" diff --git a/README.md b/README.md index 07fbe88..133405a 100644 --- a/README.md +++ b/README.md @@ -1 +1,67 @@ -# javascript-task-2 \ No newline at end of file +# Задача «Телефонная книга» + +Перед выполнением задания внимательно прочитайте: + +- [О всех этапах проверки задания](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) + +Позвони мне, позвони diff --git a/index.js b/index.js new file mode 100644 index 0000000..9b259f5 --- /dev/null +++ b/index.js @@ -0,0 +1,44 @@ +'use strict'; + +var phoneBook = require('./phone-book'); + +// Эти записи добавятся, вернется true +phoneBook.add('5554440044', 'Григорий', 'grisha@example.com'); +phoneBook.add('5552220022', 'Борис', 'boris@example.com'); +phoneBook.add('5551110011', 'Алекс'); +phoneBook.add('5553330033', 'Валерий', 'valera@example.com'); + +// Эти запись не добавятся +phoneBook.add('3330033', 'Неизвестный', 'unknown@example.com'); +phoneBook.add('5551110011', 'Алексей'); +phoneBook.add('5555550055'); + +// Обновление +phoneBook.update('5551110011', 'Алексей', 'alex@example.com'); +phoneBook.update('5553330033', 'Валерий'); + +// В следующих примерах вернутся все записи +console.info(phoneBook.find('*')); +console.info(phoneBook.find('555')); +// Вывод будет следующий +// [ +// 'Алексей, +7 (555) 111-00-11, alex@example.com', +// 'Борис, +7 (555) 222-00-22, boris@example.com', +// 'Валерий, +7 (555) 333-00-33', +// 'Григорий, +7 (555) 444-00-44, grisha@example.com' +// ] + +// Удаление +phoneBook.findAndRemove('@'); // returns 3 + +if (phoneBook.isStar) { + // Импортируем из csv + var csv = [ + 'Борис;5552220022;boris@example.com', + 'Григорий;5554440044;grisha@example.com', + 'Алексей;5551110011;alex@example.com', + 'Валерий;5553330033;valera@example.com', + 'Неизвестный;3330033;unknown@example.com' + ].join('\n'); + phoneBook.importFromCsv(csv); // returns 4 +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..1400772 --- /dev/null +++ b/package.json @@ -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" + } +} diff --git a/phone-book.js b/phone-book.js new file mode 100644 index 0000000..69fb468 --- /dev/null +++ b/phone-book.js @@ -0,0 +1,62 @@ +'use strict'; + +/** + * Сделано задание на звездочку + * Реализован метод importFromCsv + */ +exports.isStar = true; + +/** + * Телефонная книга + */ +var phoneBook; + +/** + * Добавление записи в телефонную книгу + * @param {String} phone + * @param {String} name + * @param {String} email + */ +exports.add = function (phone, name, email) { + +}; + +/** + * Обновление записи в телефонной книге + * @param {String} phone + * @param {String} name + * @param {String} email + */ +exports.update = function (phone, name, email) { + +}; + +/** + * Удаление записей по запросу из телефонной книги + * @param {String} query + */ +exports.findAndRemove = function (query) { + +}; + +/** + * Поиск записей по запросу в телефонной книге + * @param {String} query + */ +exports.find = function (query) { + +}; + +/** + * Импорт записей из csv-формата + * @star + * @param {String} csv + * @returns {Number} – количество добавленных и обновленных записей + */ +exports.importFromCsv = function (csv) { + // Парсим csv + // Добавляем в телефонную книгу + // Либо обновляем, если запись с таким телефоном уже существует + + return csv.split('\n').length; +}; diff --git a/phone-book.spec.js b/phone-book.spec.js new file mode 100644 index 0000000..1b62a1a --- /dev/null +++ b/phone-book.spec.js @@ -0,0 +1,61 @@ +/* eslint-env mocha */ +'use strict'; + +var assert = require('assert'); + +var phoneBook = require('./phone-book'); + +describe('phone-book', function () { + it('должен добавлять записи', function () { + assert.ok(phoneBook.add('5554440044', 'Григорий', 'grisha@example.com')); + assert.ok(phoneBook.add('5552220022', 'Борис', 'boris@example.com')); + assert.ok(phoneBook.add('5551110011', 'Алекс')); + assert.ok(phoneBook.add('5553330033', 'Валерий', 'valera@example.com')); + }); + + it('не должен добавлять неправильные записи', function () { + assert.ok(!phoneBook.add('3330033', 'Неизвестный', 'unknown@example.com')); + assert.ok(!phoneBook.add('5551110011', 'Алексей')); + assert.ok(!phoneBook.add('5555550055')); + }); + + it('должен обновлять существующие записи', function () { + assert.ok(phoneBook.update('5551110011', 'Алексей', 'alex@example.com')); + assert.ok(phoneBook.update('5553330033', 'Валерий')); + }); + + it('должен искать все записи по запросу "*"', function () { + assert.deepStrictEqual(phoneBook.find('*'), [ + 'Алексей, +7 (555) 111-00-11, alex@example.com', + 'Борис, +7 (555) 222-00-22, boris@example.com', + 'Валерий, +7 (555) 333-00-33', + 'Григорий, +7 (555) 444-00-44, grisha@example.com' + ]); + }); + + it('должен искать все записи по запросу "555"', function () { + assert.deepStrictEqual(phoneBook.find('555'), [ + 'Алексей, +7 (555) 111-00-11, alex@example.com', + 'Борис, +7 (555) 222-00-22, boris@example.com', + 'Валерий, +7 (555) 333-00-33', + 'Григорий, +7 (555) 444-00-44, grisha@example.com' + ]); + }); + + it('должен удалять элементы из телефонной книги', function () { + assert.strictEqual(phoneBook.findAndRemove('@'), 3); + }); + + if (phoneBook.isStar) { + it('должен экспортировать из cvs', function () { + var csv = [ + 'Борис;5552220022;boris@example.com', + 'Григорий;5554440044;grisha@example.com', + 'Алексей;5551110011;alex@example.com', + 'Валерий;5553330033;valera@example.com', + 'Неизвестный;3330033;unknown@example.com' + ].join('\n'); + assert.strictEqual(phoneBook.importFromCsv(csv), 4); + }); + } +}); From e066b19c35248222463057fbb6097e270befd4af Mon Sep 17 00:00:00 2001 From: Sergey Gogolev Date: Tue, 11 Oct 2016 20:33:47 +0500 Subject: [PATCH 02/14] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 133405a..3ec5051 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,7 @@ * На вход принимает «Телефон», «Имя» и «Электронную почту» * Возвращает true или false в зависимости от успеха опереации * Телефоны принимаются **только** в формате 5556667788 (без кода) +* Не добавляет **уже существующую** запись Метод __update__ для обновления записей: * На вход принимает «Телефон», «Имя» и «Электронную почту» From 4bd5295534078cb4d410412545007a49d50fe521 Mon Sep 17 00:00:00 2001 From: Sergey Gogolev Date: Tue, 11 Oct 2016 23:36:37 +0500 Subject: [PATCH 03/14] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3ec5051..44a59bf 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ * Ищет вхождение этой строки хотя бы в одно из полей «Телефон», «Имя» и «Электронную почту» * Возвращает отсортированный по «Имени» массив строк в формате `name, phone, email` * «Имя» и «Электронную почту» выводит как есть, а «Телефон» в формате `+7 (555) 666-77-88` -* Пустой запрос не должен ничего не находить +* Пустой запрос не должен ничего находить * Запрос «*» находит все записи Метод __findAndRemove__ для удаления записей: From d3620903248ba9b79687718ad41626aa78025ac8 Mon Sep 17 00:00:00 2001 From: NeSmogPridymatNick Date: Thu, 13 Oct 2016 11:08:56 +0500 Subject: [PATCH 04/14] Update phone-book.js --- phone-book.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phone-book.js b/phone-book.js index 69fb468..0cfa3d4 100644 --- a/phone-book.js +++ b/phone-book.js @@ -1,7 +1,7 @@ 'use strict'; /** - * Сделано задание на звездочку + * Сделано задание на звездочку. * Реализован метод importFromCsv */ exports.isStar = true; From 7c25399ef4bf195e5bbc45af329981726fb594e4 Mon Sep 17 00:00:00 2001 From: NeSmogPridymatNick Date: Mon, 17 Oct 2016 21:48:30 +0500 Subject: [PATCH 05/14] =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B2=D0=B0=D1=8F=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=BF=D1=8B=D1=82=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- phone-book.js | 154 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 152 insertions(+), 2 deletions(-) diff --git a/phone-book.js b/phone-book.js index 0cfa3d4..0e671fc 100644 --- a/phone-book.js +++ b/phone-book.js @@ -4,21 +4,97 @@ * Сделано задание на звездочку. * Реализован метод importFromCsv */ -exports.isStar = true; +exports.isStar = false; /** * Телефонная книга */ -var phoneBook; +var phoneBook = []; +var NAME = 'Name'; +var PHONE = 'Phone'; +var EMAIL = 'Email'; + +/** + * creat correct phone. + * @param {String} phone + * @returns {String} отредактированный номер + */ +function correctPhone(phone) { + + return '+7 (555) ' + phone.substr(3, 3) + '-' + phone.substr(6, 2) + '-' + phone.substr(8, 2); +} + +/** + * swap i and last elem. + * @param {Number} num + * @returns {void} + */ +function swap(num) { + var data = phoneBook[num]; + phoneBook[num] = phoneBook[phoneBook.length - 1]; + phoneBook[phoneBook.length - 1] = data; +} + +/** + * the existence check. + * @param {String} phone + * @returns {Boolean} нашли нет + */ +function findForAdd(phone) { + for (var i = 0; i < phoneBook.length; i++) { + if (phoneBook[i][PHONE] === phone) { + + return true; + } + } + + return false; +} + +/** + * проверяет корректность. + * @param {String} data + * @returns {Boolean} нашли нет + */ +function correctData(data) { + try { + if (data.length === 0) { + + return false; + } + } catch (err) { + + return false; + } + + return true; +} /** * Добавление записи в телефонную книгу * @param {String} phone * @param {String} name * @param {String} email + * @returns {Boolean} добавили нет */ exports.add = function (phone, name, email) { + if (!(/^555\d\d\d\d\d\d\d$/.test(phone))) { + return false; + } + if (email === undefined) { + email = ''; + } + if (!(correctData(name))) { + + return false; + } + if (findForAdd(phone, name, email)) { + return false; + } + phoneBook.push({ 'Phone': phone, 'Name': name, 'Email': email }); + + return true; }; /** @@ -26,25 +102,99 @@ exports.add = function (phone, name, email) { * @param {String} phone * @param {String} name * @param {String} email + * @returns {Boolean} обновили или нет */ exports.update = function (phone, name, email) { + if (correctData(name) === 0) { + + return false; + } + if (email === undefined) { + email = ''; + } + var result = 0; + for (var i = 0; i < phoneBook.length; i++) { + if (phoneBook[i][PHONE] === phone) { + phoneBook[i][NAME] = name; + phoneBook[i][EMAIL] = email; + result++; + } + } + if (result < 0) { + + return false; + } + return true; }; /** * Удаление записей по запросу из телефонной книги * @param {String} query + * @returns {Number} колличество удаленных строк */ exports.findAndRemove = function (query) { + var result = 0; + if (query === '*') { + result = phoneBook.length; + phoneBook = []; + } + for (var i = 0; i < phoneBook.length; i++) { + if ((phoneBook[i][NAME].indexOf(query) >= 0) || + (phoneBook[i][PHONE].indexOf(query) >= 0) || + (phoneBook[i][EMAIL].indexOf(query) >= 0)) { + result++; + swap(i); + i = i - 1; + phoneBook.pop(); + } + } + return result; }; +function getAllData() { + var result = []; + for (var i = 0; i < phoneBook.length; i++) { + result.push(correctStr(phoneBook[i])); + } + + return result.sort(); +} + +/** + * Добавление записи в телефонную книгу + * @param {String} str + * @returns {String} строка + */ +function correctStr(str) { + if (str[EMAIL] === '') { + + return str[NAME] + ', ' + correctPhone(str[PHONE]); + } + + return str[NAME] + ', ' + correctPhone(str[PHONE]) + ', ' + str[EMAIL]; +} /** * Поиск записей по запросу в телефонной книге * @param {String} query + * @returns {Array} массив строк */ exports.find = function (query) { + var result = []; + if (query === '*') { + + return getAllData(phoneBook); + } + for (var i = 0; i < phoneBook.length; i++) { + if ((phoneBook[i][NAME].indexOf(query) >= 0) || + (phoneBook[i][PHONE].indexOf(query) >= 0) || + (phoneBook[i][EMAIL].indexOf(query) >= 0)) { + result.push(correctStr(phoneBook[i])); + } + } + return result.sort(); }; /** From a450efd409c724507bc09db39f895e2be48f67e4 Mon Sep 17 00:00:00 2001 From: NeSmogPridymatNick Date: Mon, 17 Oct 2016 22:33:57 +0500 Subject: [PATCH 06/14] =?UTF-8?q?=D0=BF=D0=BE=D0=BF=D1=8B=D1=82=D0=BA?= =?UTF-8?q?=D0=B0=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- phone-book.js | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/phone-book.js b/phone-book.js index 0e671fc..a4d9d1d 100644 --- a/phone-book.js +++ b/phone-book.js @@ -24,6 +24,22 @@ function correctPhone(phone) { return '+7 (555) ' + phone.substr(3, 3) + '-' + phone.substr(6, 2) + '-' + phone.substr(8, 2); } +/** + * @param {Number} i + * @param {String} query + * @returns {Boolean} + */ +function index(i, query) { + if ((phoneBook[i][NAME].indexOf(query) >= 0) || + (phoneBook[i][PHONE].indexOf(query) >= 0) || + (phoneBook[i][EMAIL].indexOf(query) >= 0)) { + + return true; + } + + return false; +} + /** * swap i and last elem. * @param {Number} num @@ -139,10 +155,12 @@ exports.findAndRemove = function (query) { result = phoneBook.length; phoneBook = []; } + if (!correctData(query)) { + + return 0; + } for (var i = 0; i < phoneBook.length; i++) { - if ((phoneBook[i][NAME].indexOf(query) >= 0) || - (phoneBook[i][PHONE].indexOf(query) >= 0) || - (phoneBook[i][EMAIL].indexOf(query) >= 0)) { + if (index(i, query)) { result++; swap(i); i = i - 1; @@ -186,10 +204,12 @@ exports.find = function (query) { return getAllData(phoneBook); } + if (!correctData(query)) { + + return []; + } for (var i = 0; i < phoneBook.length; i++) { - if ((phoneBook[i][NAME].indexOf(query) >= 0) || - (phoneBook[i][PHONE].indexOf(query) >= 0) || - (phoneBook[i][EMAIL].indexOf(query) >= 0)) { + if (index(i, query)) { result.push(correctStr(phoneBook[i])); } } From 65167925382f83c3aeadb74da7706338a8c48077 Mon Sep 17 00:00:00 2001 From: NeSmogPridymatNick Date: Mon, 17 Oct 2016 22:50:47 +0500 Subject: [PATCH 07/14] 3 --- phone-book.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phone-book.js b/phone-book.js index a4d9d1d..a45cee9 100644 --- a/phone-book.js +++ b/phone-book.js @@ -121,7 +121,7 @@ exports.add = function (phone, name, email) { * @returns {Boolean} обновили или нет */ exports.update = function (phone, name, email) { - if (correctData(name) === 0) { + if (correctData(phone) === false) { return false; } From 3a9a73aad929d9483d6c48f087defdb5f0b54ee4 Mon Sep 17 00:00:00 2001 From: NeSmogPridymatNick Date: Mon, 17 Oct 2016 22:58:53 +0500 Subject: [PATCH 08/14] 4 --- phone-book.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phone-book.js b/phone-book.js index a45cee9..cd5f608 100644 --- a/phone-book.js +++ b/phone-book.js @@ -121,7 +121,7 @@ exports.add = function (phone, name, email) { * @returns {Boolean} обновили или нет */ exports.update = function (phone, name, email) { - if (correctData(phone) === false) { + if (!(/^555\d\d\d\d\d\d\d$/.test(phone))) { return false; } From eb21fcf03d4ed489e50d4a0a5a9bf9d56858ddb8 Mon Sep 17 00:00:00 2001 From: NeSmogPridymatNick Date: Mon, 17 Oct 2016 23:31:35 +0500 Subject: [PATCH 09/14] Update phone-book.js --- phone-book.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/phone-book.js b/phone-book.js index cd5f608..d67e1ed 100644 --- a/phone-book.js +++ b/phone-book.js @@ -120,10 +120,19 @@ exports.add = function (phone, name, email) { * @param {String} email * @returns {Boolean} обновили или нет */ +function correctUpdate(phone, name) { + if (!(/^555\d\d\d\d\d\d\d$/.test(phone)) || (name === undefined)) { + + return false; + } + + return true; +} exports.update = function (phone, name, email) { - if (!(/^555\d\d\d\d\d\d\d$/.test(phone))) { + if (!correctUpdate(phone, name)) { return false; + } if (email === undefined) { email = ''; From 95ddd0cf7b5e3aed779e3c02c1f7b67a61c932ed Mon Sep 17 00:00:00 2001 From: NeSmogPridymatNick Date: Mon, 17 Oct 2016 23:41:50 +0500 Subject: [PATCH 10/14] Update phone-book.js --- phone-book.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/phone-book.js b/phone-book.js index d67e1ed..31171ff 100644 --- a/phone-book.js +++ b/phone-book.js @@ -94,7 +94,7 @@ function correctData(data) { * @returns {Boolean} добавили нет */ exports.add = function (phone, name, email) { - if (!(/^555\d\d\d\d\d\d\d$/.test(phone))) { + if (!correctUpdate(phone, name, email)) { return false; } @@ -120,8 +120,8 @@ exports.add = function (phone, name, email) { * @param {String} email * @returns {Boolean} обновили или нет */ -function correctUpdate(phone, name) { - if (!(/^555\d\d\d\d\d\d\d$/.test(phone)) || (name === undefined)) { +function correctUpdate(phone, name, email) { + if (!(/^555\d\d\d\d\d\d\d$/.test(phone)) || (name === undefined) || (email === null)) { return false; } From 3cfb5067c973d89cd530aa955cce58292f12a26b Mon Sep 17 00:00:00 2001 From: NeSmogPridymatNick Date: Tue, 18 Oct 2016 00:04:08 +0500 Subject: [PATCH 11/14] Update phone-book.js --- phone-book.js | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/phone-book.js b/phone-book.js index 31171ff..65db277 100644 --- a/phone-book.js +++ b/phone-book.js @@ -30,11 +30,15 @@ function correctPhone(phone) { * @returns {Boolean} */ function index(i, query) { - if ((phoneBook[i][NAME].indexOf(query) >= 0) || - (phoneBook[i][PHONE].indexOf(query) >= 0) || - (phoneBook[i][EMAIL].indexOf(query) >= 0)) { + try { + if ((phoneBook[i][NAME].indexOf(query) >= 0) || + (phoneBook[i][PHONE].indexOf(query) >= 0) || + (phoneBook[i][EMAIL].indexOf(query) >= 0)) { - return true; + return true; + } + } catch (err) { + return false; } return false; @@ -129,7 +133,7 @@ function correctUpdate(phone, name, email) { return true; } exports.update = function (phone, name, email) { - if (!correctUpdate(phone, name)) { + if (!correctUpdate(phone, name, email)) { return false; From 6adb1d3144e6ea92b4f4324b54f6eadd62a118e2 Mon Sep 17 00:00:00 2001 From: NeSmogPridymatNick Date: Mon, 24 Oct 2016 22:56:21 +0500 Subject: [PATCH 12/14] Update phone-book.js --- phone-book.js | 303 +++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 275 insertions(+), 28 deletions(-) diff --git a/phone-book.js b/phone-book.js index 65db277..2c22cb5 100644 --- a/phone-book.js +++ b/phone-book.js @@ -30,15 +30,11 @@ function correctPhone(phone) { * @returns {Boolean} */ function index(i, query) { - try { - if ((phoneBook[i][NAME].indexOf(query) >= 0) || - (phoneBook[i][PHONE].indexOf(query) >= 0) || - (phoneBook[i][EMAIL].indexOf(query) >= 0)) { + if ((phoneBook[i][NAME].indexOf(query) >= 0) || + (phoneBook[i][PHONE].indexOf(query) >= 0) || + (phoneBook[i][EMAIL].indexOf(query) >= 0)) { - return true; - } - } catch (err) { - return false; + return true; } return false; @@ -89,6 +85,40 @@ function correctData(data) { return true; } +function correctUpdate(phone, name, email) { + if (!(/^555\d\d\d\d\d\d\d$/.test(phone)) || (name === undefined) || (email === null)) { + + return false; + } + if (name === null) { + return false; + } + + return true; +} + +function getAllData() { + var result = []; + for (var i = 0; i < phoneBook.length; i++) { + result.push(correctStr(phoneBook[i])); + } + + return result.sort(); +} + +/** + * Добавление записи в телефонную книгу + * @param {String} str + * @returns {String} строка + */ +function correctStr(str) { + if (str[EMAIL] === '') { + + return str[NAME] + ', ' + correctPhone(str[PHONE]); + } + + return str[NAME] + ', ' + correctPhone(str[PHONE]) + ', ' + str[EMAIL]; +} /** * Добавление записи в телефонную книгу @@ -110,6 +140,7 @@ exports.add = function (phone, name, email) { return false; } if (findForAdd(phone, name, email)) { + return false; } phoneBook.push({ 'Phone': phone, 'Name': name, 'Email': email }); @@ -117,6 +148,33 @@ exports.add = function (phone, name, email) { return true; }; +/** + * Удаление записей по запросу из телефонной книги + * @param {String} query + * @returns {Number} колличество удаленных строк + */ +exports.findAndRemove = function (query) { + var result = 0; + if (query === '*') { + result = phoneBook.length; + phoneBook = []; + } + if (!correctData(query)) { + + return 0; + } + for (var i = 0; i < phoneBook.length; i++) { + if (index(i, query)) { + result++; + swap(i); + i = i - 1; + phoneBook.pop(); + } + } + + return result; +}; + /** * Обновление записи в телефонной книге * @param {String} phone @@ -124,14 +182,6 @@ exports.add = function (phone, name, email) { * @param {String} email * @returns {Boolean} обновили или нет */ -function correctUpdate(phone, name, email) { - if (!(/^555\d\d\d\d\d\d\d$/.test(phone)) || (name === undefined) || (email === null)) { - - return false; - } - - return true; -} exports.update = function (phone, name, email) { if (!correctUpdate(phone, name, email)) { @@ -158,31 +208,141 @@ exports.update = function (phone, name, email) { }; /** - * Удаление записей по запросу из телефонной книги + * Поиск записей по запросу в телефонной книге * @param {String} query - * @returns {Number} колличество удаленных строк + * @returns {Array} массив строк */ -exports.findAndRemove = function (query) { - var result = 0; +exports.find = function (query) { + var result = []; if (query === '*') { - result = phoneBook.length; - phoneBook = []; + + return getAllData(phoneBook); } if (!correctData(query)) { - return 0; + return []; } for (var i = 0; i < phoneBook.length; i++) { if (index(i, query)) { - result++; - swap(i); - i = i - 1; - phoneBook.pop(); + result.push(correctStr(phoneBook[i])); } } - return result; + return result.sort(); +}; + +/** + * Импорт записей из csv-формата + * @star + * @param {String} csv + * @returns {Number} – количество добавленных и обновленных записей + */ +exports.importFromCsv = function (csv) { + // Парсим csv + // Добавляем в телефонную книгу + // Либо обновляем, если запись с таким телефоном уже существует + + return csv.split('\n').length; }; +'use strict'; + +/** + * Сделано задание на звездочку. + * Реализован метод importFromCsv + */ +exports.isStar = false; + +/** + * Телефонная книга + */ +var phoneBook = []; +var NAME = 'Name'; +var PHONE = 'Phone'; +var EMAIL = 'Email'; + +/** + * creat correct phone. + * @param {String} phone + * @returns {String} отредактированный номер + */ +function correctPhone(phone) { + + return '+7 (555) ' + phone.substr(3, 3) + '-' + phone.substr(6, 2) + '-' + phone.substr(8, 2); +} + +/** + * @param {Number} i + * @param {String} query + * @returns {Boolean} + */ +function index(i, query) { + if ((phoneBook[i][NAME].indexOf(query) >= 0) || + (phoneBook[i][PHONE].indexOf(query) >= 0) || + (phoneBook[i][EMAIL].indexOf(query) >= 0)) { + + return true; + } + + return false; +} + +/** + * swap i and last elem. + * @param {Number} num + * @returns {void} + */ +function swap(num) { + var data = phoneBook[num]; + phoneBook[num] = phoneBook[phoneBook.length - 1]; + phoneBook[phoneBook.length - 1] = data; +} + +/** + * the existence check. + * @param {String} phone + * @returns {Boolean} нашли нет + */ +function findForAdd(phone) { + for (var i = 0; i < phoneBook.length; i++) { + if (phoneBook[i][PHONE] === phone) { + + return true; + } + } + + return false; +} + +/** + * проверяет корректность. + * @param {String} data + * @returns {Boolean} нашли нет + */ +function correctData(data) { + try { + if (data.length === 0) { + + return false; + } + } catch (err) { + + return false; + } + + return true; +} +function correctUpdate(phone, name, email) { + if (!(/^555\d\d\d\d\d\d\d$/.test(phone)) || (name === undefined) || (email === null)) { + + return false; + } + if (name === null) { + return false; + } + + return true; +} + function getAllData() { var result = []; for (var i = 0; i < phoneBook.length; i++) { @@ -206,6 +366,93 @@ function correctStr(str) { return str[NAME] + ', ' + correctPhone(str[PHONE]) + ', ' + str[EMAIL]; } +/** + * Добавление записи в телефонную книгу + * @param {String} phone + * @param {String} name + * @param {String} email + * @returns {Boolean} добавили нет + */ +exports.add = function (phone, name, email) { + if (!correctUpdate(phone, name, email)) { + + return false; + } + if (email === undefined) { + email = ''; + } + if (!(correctData(name))) { + + return false; + } + if (findForAdd(phone, name, email)) { + + return false; + } + phoneBook.push({ 'Phone': phone, 'Name': name, 'Email': email }); + + return true; +}; + +/** + * Удаление записей по запросу из телефонной книги + * @param {String} query + * @returns {Number} колличество удаленных строк + */ +exports.findAndRemove = function (query) { + var result = 0; + if (query === '*') { + result = phoneBook.length; + phoneBook = []; + } + if (!correctData(query)) { + + return 0; + } + for (var i = 0; i < phoneBook.length; i++) { + if (index(i, query)) { + result++; + swap(i); + i = i - 1; + phoneBook.pop(); + } + } + + return result; +}; + +/** + * Обновление записи в телефонной книге + * @param {String} phone + * @param {String} name + * @param {String} email + * @returns {Boolean} обновили или нет + */ +exports.update = function (phone, name, email) { + if (!correctUpdate(phone, name, email)) { + + return false; + + } + if (email === undefined) { + email = ''; + } + var result = 0; + for (var i = 0; i < phoneBook.length; i++) { + if (phoneBook[i][PHONE] === phone) { + phoneBook[i][NAME] = name; + phoneBook[i][EMAIL] = email; + result++; + } + } + if (result < 0) { + + return false; + } + + return true; +}; + /** * Поиск записей по запросу в телефонной книге * @param {String} query From 128bebd15f49ce2062eb7ece0feb7dee7c00090d Mon Sep 17 00:00:00 2001 From: NeSmogPridymatNick Date: Mon, 24 Oct 2016 23:01:01 +0500 Subject: [PATCH 13/14] Update phone-book.js --- phone-book.js | 1 + 1 file changed, 1 insertion(+) diff --git a/phone-book.js b/phone-book.js index 2c22cb5..99cc2e2 100644 --- a/phone-book.js +++ b/phone-book.js @@ -91,6 +91,7 @@ function correctUpdate(phone, name, email) { return false; } if (name === null) { + return false; } From aa89d1d7b1a7d699a399e0475a074ccc086eb02a Mon Sep 17 00:00:00 2001 From: NeSmogPridymatNick Date: Mon, 24 Oct 2016 23:02:31 +0500 Subject: [PATCH 14/14] Update phone-book.js --- phone-book.js | 246 -------------------------------------------------- 1 file changed, 246 deletions(-) diff --git a/phone-book.js b/phone-book.js index 99cc2e2..cb276ff 100644 --- a/phone-book.js +++ b/phone-book.js @@ -245,249 +245,3 @@ exports.importFromCsv = function (csv) { return csv.split('\n').length; }; -'use strict'; - -/** - * Сделано задание на звездочку. - * Реализован метод importFromCsv - */ -exports.isStar = false; - -/** - * Телефонная книга - */ -var phoneBook = []; -var NAME = 'Name'; -var PHONE = 'Phone'; -var EMAIL = 'Email'; - -/** - * creat correct phone. - * @param {String} phone - * @returns {String} отредактированный номер - */ -function correctPhone(phone) { - - return '+7 (555) ' + phone.substr(3, 3) + '-' + phone.substr(6, 2) + '-' + phone.substr(8, 2); -} - -/** - * @param {Number} i - * @param {String} query - * @returns {Boolean} - */ -function index(i, query) { - if ((phoneBook[i][NAME].indexOf(query) >= 0) || - (phoneBook[i][PHONE].indexOf(query) >= 0) || - (phoneBook[i][EMAIL].indexOf(query) >= 0)) { - - return true; - } - - return false; -} - -/** - * swap i and last elem. - * @param {Number} num - * @returns {void} - */ -function swap(num) { - var data = phoneBook[num]; - phoneBook[num] = phoneBook[phoneBook.length - 1]; - phoneBook[phoneBook.length - 1] = data; -} - -/** - * the existence check. - * @param {String} phone - * @returns {Boolean} нашли нет - */ -function findForAdd(phone) { - for (var i = 0; i < phoneBook.length; i++) { - if (phoneBook[i][PHONE] === phone) { - - return true; - } - } - - return false; -} - -/** - * проверяет корректность. - * @param {String} data - * @returns {Boolean} нашли нет - */ -function correctData(data) { - try { - if (data.length === 0) { - - return false; - } - } catch (err) { - - return false; - } - - return true; -} -function correctUpdate(phone, name, email) { - if (!(/^555\d\d\d\d\d\d\d$/.test(phone)) || (name === undefined) || (email === null)) { - - return false; - } - if (name === null) { - return false; - } - - return true; -} - -function getAllData() { - var result = []; - for (var i = 0; i < phoneBook.length; i++) { - result.push(correctStr(phoneBook[i])); - } - - return result.sort(); -} - -/** - * Добавление записи в телефонную книгу - * @param {String} str - * @returns {String} строка - */ -function correctStr(str) { - if (str[EMAIL] === '') { - - return str[NAME] + ', ' + correctPhone(str[PHONE]); - } - - return str[NAME] + ', ' + correctPhone(str[PHONE]) + ', ' + str[EMAIL]; -} - -/** - * Добавление записи в телефонную книгу - * @param {String} phone - * @param {String} name - * @param {String} email - * @returns {Boolean} добавили нет - */ -exports.add = function (phone, name, email) { - if (!correctUpdate(phone, name, email)) { - - return false; - } - if (email === undefined) { - email = ''; - } - if (!(correctData(name))) { - - return false; - } - if (findForAdd(phone, name, email)) { - - return false; - } - phoneBook.push({ 'Phone': phone, 'Name': name, 'Email': email }); - - return true; -}; - -/** - * Удаление записей по запросу из телефонной книги - * @param {String} query - * @returns {Number} колличество удаленных строк - */ -exports.findAndRemove = function (query) { - var result = 0; - if (query === '*') { - result = phoneBook.length; - phoneBook = []; - } - if (!correctData(query)) { - - return 0; - } - for (var i = 0; i < phoneBook.length; i++) { - if (index(i, query)) { - result++; - swap(i); - i = i - 1; - phoneBook.pop(); - } - } - - return result; -}; - -/** - * Обновление записи в телефонной книге - * @param {String} phone - * @param {String} name - * @param {String} email - * @returns {Boolean} обновили или нет - */ -exports.update = function (phone, name, email) { - if (!correctUpdate(phone, name, email)) { - - return false; - - } - if (email === undefined) { - email = ''; - } - var result = 0; - for (var i = 0; i < phoneBook.length; i++) { - if (phoneBook[i][PHONE] === phone) { - phoneBook[i][NAME] = name; - phoneBook[i][EMAIL] = email; - result++; - } - } - if (result < 0) { - - return false; - } - - return true; -}; - -/** - * Поиск записей по запросу в телефонной книге - * @param {String} query - * @returns {Array} массив строк - */ -exports.find = function (query) { - var result = []; - if (query === '*') { - - return getAllData(phoneBook); - } - if (!correctData(query)) { - - return []; - } - for (var i = 0; i < phoneBook.length; i++) { - if (index(i, query)) { - result.push(correctStr(phoneBook[i])); - } - } - - return result.sort(); -}; - -/** - * Импорт записей из csv-формата - * @star - * @param {String} csv - * @returns {Number} – количество добавленных и обновленных записей - */ -exports.importFromCsv = function (csv) { - // Парсим csv - // Добавляем в телефонную книгу - // Либо обновляем, если запись с таким телефоном уже существует - - return csv.split('\n').length; -};