From 9ff3ddc498fb9a04a141e3bd12d8eba718cf9ea1 Mon Sep 17 00:00:00 2001 From: Sergey Gogolev Date: Tue, 11 Oct 2016 17:53:02 +0500 Subject: [PATCH 01/13] =?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/13] 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/13] 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 57ce796ce091e57cd61b2af0de88d973506901df Mon Sep 17 00:00:00 2001 From: Sergey Gogolev Date: Fri, 14 Oct 2016 00:16:56 +0500 Subject: [PATCH 04/13] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 44a59bf..1ce4fbf 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,7 @@ * Возвращает true или false в зависимости от успеха опереации * Телефоны принимаются **только** в формате 5556667788 (без кода) * Не добавляет **уже существующую** запись +* Не добавляет запись **без имени** Метод __update__ для обновления записей: * На вход принимает «Телефон», «Имя» и «Электронную почту» From 1c8437a232bdb0cc1cbf6db75602e99a7598e140 Mon Sep 17 00:00:00 2001 From: SergeyIstomin96 Date: Wed, 2 Nov 2016 22:36:59 +0500 Subject: [PATCH 05/13] First try --- phone-book.js | 128 +++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 122 insertions(+), 6 deletions(-) diff --git a/phone-book.js b/phone-book.js index 69fb468..866ae79 100644 --- a/phone-book.js +++ b/phone-book.js @@ -4,21 +4,64 @@ * Сделано задание на звездочку * Реализован метод importFromCsv */ -exports.isStar = true; +exports.isStar = false; /** * Телефонная книга */ -var phoneBook; +var phoneBook = []; + + /** + * Поиск записи в книге по телефону + * @param {String} query + */ +function findByPhone (query) { + for (var i=0; i b.name) { + return 1; + } + if (a.name < b.name) { + return -1; + } + return 0; + }); + if (query == '*') { return res; } + var i=0; + while(i < res.length) { + if (res[i].phone.indexOf(query) != -1) { + i++; + continue; + } + else if (res[i].name.indexOf(query) != -1){ + i++; + continue; + } + else if (res[i].email !== undefined){ + if (res[i].email.indexOf(query) != -1){ + i++; + continue; + } + } + res.splice(i, 1); + } + return res; }; /** From 360b38ca007953187945193491bde589334dcff4 Mon Sep 17 00:00:00 2001 From: SergeyIstomin96 Date: Wed, 2 Nov 2016 23:17:57 +0500 Subject: [PATCH 06/13] Second try --- phone-book.js | 94 +++++++++++++++++++++++++++++++++++---------------- 1 file changed, 64 insertions(+), 30 deletions(-) diff --git a/phone-book.js b/phone-book.js index 866ae79..6b5d3ce 100644 --- a/phone-book.js +++ b/phone-book.js @@ -14,30 +14,37 @@ var phoneBook = []; /** * Поиск записи в книге по телефону * @param {String} query + * @return {Number} result */ -function findByPhone (query) { - for (var i=0; i b.name) { return 1; } @@ -141,24 +164,35 @@ exports.find = function (query) { } return 0; }); - if (query == '*') { return res; } - var i=0; - while(i < res.length) { - if (res[i].phone.indexOf(query) != -1) { - i++; - continue; - } - else if (res[i].name.indexOf(query) != -1){ - i++; - continue; - } - else if (res[i].email !== undefined){ - if (res[i].email.indexOf(query) != -1){ + if (query != '*') { + var i = 0; + while (i < copy.length) { + if (copy[i].phone.indexOf(query) != -1) { + i++; + continue; + } + else if (copy[i].name.indexOf(query) != -1) { i++; continue; } + else if (copy[i].email !== undefined) { + if (copy[i].email.indexOf(query) != -1) { + i++; + continue; + } + } + copy.splice(i, 1); + } + var temp = ''; + for (i = 0; i < copy.length; i++) { + temp = '+7 (' + copy[i].phone.slice(0, 3) + ') ' + copy[i].phone.slice(3, 6) + '-'; + temp += copy[i].phone.slice(6, 8) + '-' + copy[i].phone.slice(8, 10); + copy[i].phone = temp; } - res.splice(i, 1); + } + var res = []; + for (i = 0; i < copy.length; i++) { + res.push(copy[i].name + ', ' + copy[i].phone + ', ' + copy[i].email); } return res; }; From 429a69c6628e5c2082bbae797f4e4576299a05cf Mon Sep 17 00:00:00 2001 From: SergeyIstomin96 Date: Wed, 2 Nov 2016 23:27:06 +0500 Subject: [PATCH 07/13] Second try --- phone-book.js | 44 ++++++++++++++++++++------------------------ 1 file changed, 20 insertions(+), 24 deletions(-) diff --git a/phone-book.js b/phone-book.js index 6b5d3ce..966fdef 100644 --- a/phone-book.js +++ b/phone-book.js @@ -14,7 +14,7 @@ var phoneBook = []; /** * Поиск записи в книге по телефону * @param {String} query - * @return {Number} result + * @returns {Number} result */ function findByPhone(query) { for (var i = 0; i < phoneBook.length; i++) { @@ -25,28 +25,27 @@ function findByPhone(query) { } return -1; -}; +} /** * Проверка номера * @param {String} phone - * @return {boolean} result + * @returns {boolean} result */ function phoneIsGood(phone) { - if (phone.length == 10) { + if (phone.length === 10) { var regex = /[0-9]+/; // похоже неверно - if (phone.match(regex)==null) { + if (phone.match(regex) === null) { return false; } - } - else { + } else { return false; } return true; -}; +} /** * Добавление записи в телефонную книгу @@ -64,7 +63,7 @@ exports.add = function (phone, name, email) { return false; } - if (findByPhone(phone)!=-1) { + if (findByPhone(phone) !== -1) { return false; } @@ -83,6 +82,7 @@ exports.add = function (phone, name, email) { * @param {String} phone * @param {String} name * @param {String} email + * @returns {boolean} result */ exports.update = function (phone, name, email) { if (!phoneIsGood(phone)) { @@ -90,7 +90,7 @@ exports.update = function (phone, name, email) { return false; } var ind = findByPhone(phone); - if (ind == -1) { + if (ind === -1) { return false; } @@ -99,8 +99,7 @@ exports.update = function (phone, name, email) { } if (email === undefined) { phoneBook[ind].email = ''; - } - else { + } else { phoneBook[ind].email = email; } @@ -115,7 +114,7 @@ exports.update = function (phone, name, email) { exports.findAndRemove = function (query) { if (query === undefined) { return 0; } var res = 0; - if (query == '*') { + if (query === '*') { res = phoneBook.length; phoneBook.splice(0, res); @@ -123,18 +122,16 @@ exports.findAndRemove = function (query) { } var i=0; while(i < phoneBook.length) { - if (phoneBook[i].phone.indexOf(query) != -1) { + if (phoneBook[i].phone.indexOf(query) !== -1) { res++; phoneBook.splice(i, 1); continue; - } - else if (phoneBook[i].name.indexOf(query) != -1){ + } else if (phoneBook[i].name.indexOf(query) !== -1){ res ++; phoneBook.splice(i, 1); continue; - } - else if (phoneBook[i].email !== undefined){ - if (phoneBook[i].email.indexOf(query) != -1){ + } else if (phoneBook[i].email !== undefined){ + if (phoneBook[i].email.indexOf(query) !== -1){ res ++; phoneBook.splice(i, 1); continue; @@ -164,18 +161,16 @@ exports.find = function (query) { } return 0; }); - if (query != '*') { + if (query !== '*') { var i = 0; while (i < copy.length) { if (copy[i].phone.indexOf(query) != -1) { i++; continue; - } - else if (copy[i].name.indexOf(query) != -1) { + } else if (copy[i].name.indexOf(query) != -1) { i++; continue; - } - else if (copy[i].email !== undefined) { + } else if (copy[i].email !== undefined) { if (copy[i].email.indexOf(query) != -1) { i++; continue; @@ -194,6 +189,7 @@ exports.find = function (query) { for (i = 0; i < copy.length; i++) { res.push(copy[i].name + ', ' + copy[i].phone + ', ' + copy[i].email); } + return res; }; From 2a78ec579b5126518c59aa76033171eda30f0f1e Mon Sep 17 00:00:00 2001 From: SergeyIstomin96 Date: Wed, 2 Nov 2016 23:56:12 +0500 Subject: [PATCH 08/13] Third try --- phone-book.js | 41 ++++++++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/phone-book.js b/phone-book.js index 966fdef..96af07b 100644 --- a/phone-book.js +++ b/phone-book.js @@ -106,10 +106,31 @@ exports.update = function (phone, name, email) { return true; }; +/** + * Поиск записи в книге по телефону + * @param {String} query + * @param {Object} note + * @returns {boolean} result + */ +function findMatches(query, note) { + if (note.phone.indexOf(query) !== -1) { + return true; + } + if (note.name.indexOf(query) !== -1) { + return true; + } + if (phoneBook[i].email !== undefined) { + if (note.email.indexOf(query) !== -1) { + return true; + } + } + return false; +} + /** * Удаление записей по запросу из телефонной книги * @param {String} query - * @return {Number} result + * @returns {Number} result */ exports.findAndRemove = function (query) { if (query === undefined) { return 0; } @@ -121,21 +142,11 @@ exports.findAndRemove = function (query) { return res; } var i=0; - while(i < phoneBook.length) { - if (phoneBook[i].phone.indexOf(query) !== -1) { + while (i < phoneBook.length) { + if (findMatches(query, phoneBook[i])) { res++; phoneBook.splice(i, 1); continue; - } else if (phoneBook[i].name.indexOf(query) !== -1){ - res ++; - phoneBook.splice(i, 1); - continue; - } else if (phoneBook[i].email !== undefined){ - if (phoneBook[i].email.indexOf(query) !== -1){ - res ++; - phoneBook.splice(i, 1); - continue; - } } i++; } @@ -146,7 +157,7 @@ exports.findAndRemove = function (query) { /** * Поиск записей по запросу в телефонной книге * @param {String} query - * @return {Array} result + * @returns {Array} result */ exports.find = function (query) { var copy = []; @@ -189,7 +200,7 @@ exports.find = function (query) { for (i = 0; i < copy.length; i++) { res.push(copy[i].name + ', ' + copy[i].phone + ', ' + copy[i].email); } - + return res; }; From b2fdbe9ec7df3302054f6f3b08f7a2783a4ba1e2 Mon Sep 17 00:00:00 2001 From: SergeyIstomin96 Date: Thu, 3 Nov 2016 00:00:30 +0500 Subject: [PATCH 09/13] Forth try --- phone-book.js | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/phone-book.js b/phone-book.js index 96af07b..168b0c9 100644 --- a/phone-book.js +++ b/phone-book.js @@ -114,16 +114,20 @@ exports.update = function (phone, name, email) { */ function findMatches(query, note) { if (note.phone.indexOf(query) !== -1) { + return true; } if (note.name.indexOf(query) !== -1) { + return true; } - if (phoneBook[i].email !== undefined) { + if (note.email !== undefined) { if (note.email.indexOf(query) !== -1) { + return true; } } + return false; } @@ -141,7 +145,7 @@ exports.findAndRemove = function (query) { return res; } - var i=0; + var i = 0; while (i < phoneBook.length) { if (findMatches(query, phoneBook[i])) { res++; @@ -175,14 +179,14 @@ exports.find = function (query) { if (query !== '*') { var i = 0; while (i < copy.length) { - if (copy[i].phone.indexOf(query) != -1) { + if (copy[i].phone.indexOf(query) !== -1) { i++; continue; - } else if (copy[i].name.indexOf(query) != -1) { + } else if (copy[i].name.indexOf(query) !== -1) { i++; continue; } else if (copy[i].email !== undefined) { - if (copy[i].email.indexOf(query) != -1) { + if (copy[i].email.indexOf(query) !== -1) { i++; continue; } From c3c8a0c4f03aa673a6f24004b9a9948f88f72565 Mon Sep 17 00:00:00 2001 From: SergeyIstomin96 Date: Thu, 3 Nov 2016 00:02:38 +0500 Subject: [PATCH 10/13] Fifth try --- phone-book.js | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/phone-book.js b/phone-book.js index 168b0c9..16c505c 100644 --- a/phone-book.js +++ b/phone-book.js @@ -176,20 +176,12 @@ exports.find = function (query) { } return 0; }); + var i = 0; if (query !== '*') { - var i = 0; while (i < copy.length) { - if (copy[i].phone.indexOf(query) !== -1) { - i++; - continue; - } else if (copy[i].name.indexOf(query) !== -1) { + if (findMatches(query, copy[i])) { i++; continue; - } else if (copy[i].email !== undefined) { - if (copy[i].email.indexOf(query) !== -1) { - i++; - continue; - } } copy.splice(i, 1); } From ca729dc41b7f99b71326d981b179cfad75011b36 Mon Sep 17 00:00:00 2001 From: SergeyIstomin96 Date: Thu, 3 Nov 2016 00:26:24 +0500 Subject: [PATCH 11/13] Six try --- phone-book.js | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/phone-book.js b/phone-book.js index 16c505c..ee6c32d 100644 --- a/phone-book.js +++ b/phone-book.js @@ -158,6 +158,21 @@ exports.findAndRemove = function (query) { return res; }; +/** + * Поиск записи в книге по телефону + * @param {Object} copy + * @returns {Array} result + */ +function changeFormat(copy) { + var temp = []; + for (var i = 0; i < copy.length; i++) { + temp[i] = '+7 (' + copy[i].phone.slice(0, 3) + ') ' + copy[i].phone.slice(3, 6) + '-'; + temp[i] += copy[i].phone.slice(6, 8) + '-' + copy[i].phone.slice(8, 10); + } + + return temp; +} + /** * Поиск записей по запросу в телефонной книге * @param {String} query @@ -166,14 +181,19 @@ exports.findAndRemove = function (query) { exports.find = function (query) { var copy = []; if (query === undefined) { return copy; } - copy = phoneBook; + for (var key in phoneBook) { + copy[key] = phoneBook[key]; + } copy.sort(function (a, b) { if (a.name > b.name) { + return 1; } if (a.name < b.name) { + return -1; } + return 0; }); var i = 0; @@ -185,16 +205,11 @@ exports.find = function (query) { } copy.splice(i, 1); } - var temp = ''; - for (i = 0; i < copy.length; i++) { - temp = '+7 (' + copy[i].phone.slice(0, 3) + ') ' + copy[i].phone.slice(3, 6) + '-'; - temp += copy[i].phone.slice(6, 8) + '-' + copy[i].phone.slice(8, 10); - copy[i].phone = temp; - } } + var newPhones=changeFormat(copy); var res = []; for (i = 0; i < copy.length; i++) { - res.push(copy[i].name + ', ' + copy[i].phone + ', ' + copy[i].email); + res.push(copy[i].name + ', ' + newPhones[i] + ', ' + copy[i].email); } return res; From 7c3feec3825d572b53d5c1483e586852cf28b043 Mon Sep 17 00:00:00 2001 From: SergeyIstomin96 Date: Thu, 3 Nov 2016 00:32:45 +0500 Subject: [PATCH 12/13] Seventh try --- phone-book.js | 39 +++++++++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/phone-book.js b/phone-book.js index ee6c32d..98f1f17 100644 --- a/phone-book.js +++ b/phone-book.js @@ -137,7 +137,10 @@ function findMatches(query, note) { * @returns {Number} result */ exports.findAndRemove = function (query) { - if (query === undefined) { return 0; } + if (query === undefined) { + + return 0; + } var res = 0; if (query === '*') { res = phoneBook.length; @@ -173,6 +176,25 @@ function changeFormat(copy) { return temp; } +/** + * Поиск записи в книге по телефону + * @param {Object} a + * @param {Object} b + * @returns {Number} result + */ +function sortByName(a, b) { + if (a.name > b.name) { + + return 1; + } + if (a.name < b.name) { + + return -1; + } + + return 0; +} + /** * Поиск записей по запросу в телефонной книге * @param {String} query @@ -184,18 +206,7 @@ exports.find = function (query) { for (var key in phoneBook) { copy[key] = phoneBook[key]; } - copy.sort(function (a, b) { - if (a.name > b.name) { - - return 1; - } - if (a.name < b.name) { - - return -1; - } - - return 0; - }); + copy.sort(sortByName); var i = 0; if (query !== '*') { while (i < copy.length) { @@ -206,7 +217,7 @@ exports.find = function (query) { copy.splice(i, 1); } } - var newPhones=changeFormat(copy); + var newPhones = changeFormat(copy); var res = []; for (i = 0; i < copy.length; i++) { res.push(copy[i].name + ', ' + newPhones[i] + ', ' + copy[i].email); From fc79076599d2f473c50e84a5b4708ac6ae9d5605 Mon Sep 17 00:00:00 2001 From: SergeyIstomin96 Date: Sat, 5 Nov 2016 16:52:27 +0500 Subject: [PATCH 13/13] =?UTF-8?q?=D0=9F=D0=BE=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- phone-book.js | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/phone-book.js b/phone-book.js index 98f1f17..71f0be5 100644 --- a/phone-book.js +++ b/phone-book.js @@ -107,7 +107,7 @@ exports.update = function (phone, name, email) { }; /** - * Поиск записи в книге по телефону + * Поиск совпадений в данной записи * @param {String} query * @param {Object} note * @returns {boolean} result @@ -162,7 +162,7 @@ exports.findAndRemove = function (query) { }; /** - * Поиск записи в книге по телефону + * Изменение формата новера телефона * @param {Object} copy * @returns {Array} result */ @@ -177,7 +177,7 @@ function changeFormat(copy) { } /** - * Поиск записи в книге по телефону + * Вспомогательная функция для сортировки по имени * @param {Object} a * @param {Object} b * @returns {Number} result @@ -195,18 +195,30 @@ function sortByName(a, b) { return 0; } +/** + * Копирование телефонной книги + * @param {Object} a + * @returns {Object} result + */ +function Copy(a) { + var result = []; + for (var key in phoneBook) { + result[key] = phoneBook[key]; + } + result.sort(sortByName); + return result; +} + /** * Поиск записей по запросу в телефонной книге * @param {String} query * @returns {Array} result */ exports.find = function (query) { - var copy = []; - if (query === undefined) { return copy; } - for (var key in phoneBook) { - copy[key] = phoneBook[key]; + if (query === undefined) { + return []; } - copy.sort(sortByName); + var copy = Copy(phoneBook); var i = 0; if (query !== '*') { while (i < copy.length) {