From 9ff3ddc498fb9a04a141e3bd12d8eba718cf9ea1 Mon Sep 17 00:00:00 2001 From: Sergey Gogolev Date: 2016年10月11日 17:53:02 +0500 Subject: [PATCH 1/5] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=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: 2016年10月11日 20:33:47 +0500 Subject: [PATCH 2/5] 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 0074f162abb32973fbcfc8927a0b548235cbebb8 Mon Sep 17 00:00:00 2001 From: Matvey Date: 2016年10月14日 21:56:43 +0500 Subject: [PATCH 3/5] Phone book --- phone-book.js | 160 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 158 insertions(+), 2 deletions(-) diff --git a/phone-book.js b/phone-book.js index 69fb468..186a91b 100644 --- a/phone-book.js +++ b/phone-book.js @@ -9,16 +9,98 @@ exports.isStar = true; /** * Телефонная книга */ -var phoneBook; +var phoneBook = []; + +function isValidation(phone, name) { + var re = /^\d{10}$/; + if (re.test(phone) && name) { + + return true; + } + + return false; +} + +function isHave(phone) { + for (var i = 0; i < phoneBook.length; i++) { + var contact = phoneBook[i]; + if (contact.phone === phone) { + + return false; + } + } + + return true; +} + +function sortByName(contacts) { + contacts.sort(function (a, b) { + if (a.name> b.name) { + + return 1; + } + if (a.name < b.name) { + + return -1; + } + + return 0; + }); + + return contacts; +} + +function getContacts(contacts) { + for (var i = 0; i < phoneBook.length; i++) { + var newPhone = '+7 (' + contacts[i].phone.slice(0, 3) + + ') ' + contacts[i].phone.slice(3, 6) + + '-' + contacts[i].phone.slice(6, 8) + + '-' + contacts[i].phone.slice(-2); + if (contacts[i].email) { + contacts[i] = contacts[i].name + + ', ' + newPhone + + ', ' + contacts[i].email; + } else { + contacts[i] = contacts[i].name + + ', ' + newPhone; + } + } + + return contacts; +} + +function addContact(contacts, query) { + for (var i = 0; i < phoneBook.length; i++) { + if (phoneBook[i].phone.indexOf(query) !== -1 || + phoneBook[i].name.indexOf(query) !== -1 || + phoneBook[i].email.indexOf(query) !== -1) { + contacts.push(phoneBook[i]); + } + } + contacts = sortByName(contacts); + + return getContacts(contacts); +} /** * Добавление записи в телефонную книгу * @param {String} phone * @param {String} name * @param {String} email + * @returns {boolean} */ exports.add = function (phone, name, email) { + if (isValidation(phone, name) && isHave(phone)) { + if (email !== undefined) { + phoneBook.push({ 'phone': phone, 'name': name, 'email': email }); + } else { + phoneBook.push({ 'phone': phone, 'name': name, 'email': '' }); + } + + return true; + } + return false; }; /** @@ -26,25 +108,86 @@ exports.add = function (phone, name, email) { * @param {String} phone * @param {String} name * @param {String} email + * @returns {boolean} */ exports.update = function (phone, name, email) { + for (var i = 0; i < phoneBook.length; i++) { + if (phoneBook[i].phone === phone && name && email !== undefined) { + phoneBook[i].name = name; + phoneBook[i].email = email; + return true; + } + if (phoneBook[i].phone === phone && name) { + phoneBook[i].name = name; + phoneBook[i].email = ''; + + return true; + } + } + + return false; }; /** * Удаление записей по запросу из телефонной книги * @param {String} query + * @returns {number} */ exports.findAndRemove = function (query) { + var count = 0; + var len = phoneBook.length; + if (!query) { + + return count; + } + if (query === '*') { + for (var j = 0; j < len; j++) { + phoneBook.shift(); + count++; + } + return count; + } + count = phoneBook.length; + phoneBook = phoneBook.filter(function (obj) { + if (obj.phone.indexOf(query) === -1 && + obj.name.indexOf(query) === -1 && + obj.email.indexOf(query) === -1) { + + return true; + } + + return false; + }); + + + return count - phoneBook.length; }; /** * Поиск записей по запросу в телефонной книге * @param {String} query + * @returns {Array} */ exports.find = function (query) { + var contacts = []; + if (!query) { + + return contacts; + } + if (query === '*') { + for (var j = 0; j < phoneBook.length; j++) { + contacts.push(phoneBook[j]); + } + contacts = sortByName(contacts); + contacts = getContacts(contacts); + + return contacts; + } + contacts = addContact(contacts, query); + return contacts; }; /** @@ -57,6 +200,19 @@ exports.importFromCsv = function (csv) { // Парсим csv // Добавляем в телефонную книгу // Либо обновляем, если запись с таким телефоном уже существует + var count = 0; + if (!csv) { + return count; + } + var contactInfo = []; + var contacts = csv.split('\n'); + for (var i = 0; i < contacts.length; i++) { + contactInfo = contacts[i].split(';'); + if (exports.add(contactInfo[1], contactInfo[0], contactInfo[2]) || + exports.update(contactInfo[1], contactInfo[0], contactInfo[2])) { + count++; + } + } - return csv.split('\n').length; + return count; }; From 25e20709a172484a7f8ab10e3b95191fb0dac984 Mon Sep 17 00:00:00 2001 From: Matvey Date: 2016年10月15日 08:52:58 +0500 Subject: [PATCH 4/5] add more checks --- phone-book.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/phone-book.js b/phone-book.js index 186a91b..2e23b64 100644 --- a/phone-book.js +++ b/phone-book.js @@ -13,7 +13,7 @@ var phoneBook = []; function isValidation(phone, name) { var re = /^\d{10}$/; - if (re.test(phone) && name) { + if (re.test(phone) && name !== undefined && name.length> 0) { return true; } @@ -111,6 +111,10 @@ exports.add = function (phone, name, email) { * @returns {boolean} */ exports.update = function (phone, name, email) { + if (!isValidation(phone, name)) { + + return false; + } for (var i = 0; i < phoneBook.length; i++) { if (phoneBook[i].phone === phone && name && email !== undefined) { phoneBook[i].name = name; @@ -172,12 +176,13 @@ exports.findAndRemove = function (query) { */ exports.find = function (query) { var contacts = []; + var len = phoneBook.length; if (!query) { return contacts; } if (query === '*') { - for (var j = 0; j < phoneBook.length; j++) { + for (var j = 0; j < len; j++) { contacts.push(phoneBook[j]); } contacts = sortByName(contacts); From 8a5df081a4905b043cc79d6ba6443682524d8bf0 Mon Sep 17 00:00:00 2001 From: Matvey Date: 2016年10月16日 11:23:40 +0500 Subject: [PATCH 5/5] Rebuild this s**t --- phone-book.js | 131 +++++++++++++------------------------------------- 1 file changed, 33 insertions(+), 98 deletions(-) diff --git a/phone-book.js b/phone-book.js index 2e23b64..4c6cc8d 100644 --- a/phone-book.js +++ b/phone-book.js @@ -11,9 +11,11 @@ exports.isStar = true; */ var phoneBook = []; -function isValidation(phone, name) { +function isValidation(phone, name, email) { var re = /^\d{10}$/; - if (re.test(phone) && name !== undefined && name.length> 0) { + if (re.test(phone) && name !== undefined && name.length> 0 && + typeof name === 'string' && + (typeof email === 'string' || email === undefined)) { return true; } @@ -23,8 +25,7 @@ function isValidation(phone, name) { function isHave(phone) { for (var i = 0; i < phoneBook.length; i++) { - var contact = phoneBook[i]; - if (contact.phone === phone) { + if (phoneBook[i].phone === phone.toString()) { return false; } @@ -33,53 +34,17 @@ function isHave(phone) { return true; } -function sortByName(contacts) { - contacts.sort(function (a, b) { - if (a.name> b.name) { - - return 1; - } - if (a.name < b.name) { - - return -1; - } - - return 0; - }); - - return contacts; -} - -function getContacts(contacts) { - for (var i = 0; i < phoneBook.length; i++) { - var newPhone = '+7 (' + contacts[i].phone.slice(0, 3) + - ') ' + contacts[i].phone.slice(3, 6) + - '-' + contacts[i].phone.slice(6, 8) + - '-' + contacts[i].phone.slice(-2); - if (contacts[i].email) { - contacts[i] = contacts[i].name + - ', ' + newPhone + - ', ' + contacts[i].email; - } else { - contacts[i] = contacts[i].name + - ', ' + newPhone; - } - } - - return contacts; -} - -function addContact(contacts, query) { - for (var i = 0; i < phoneBook.length; i++) { - if (phoneBook[i].phone.indexOf(query) !== -1 || - phoneBook[i].name.indexOf(query) !== -1 || - phoneBook[i].email.indexOf(query) !== -1) { - contacts.push(phoneBook[i]); - } +function getContact(contact) { + var correctEmail = ''; + var newPhone = '+7 (' + contact.phone.slice(0, 3) + + ') ' + contact.phone.slice(3, 6) + + '-' + contact.phone.slice(6, 8) + + '-' + contact.phone.slice(-2); + if (contact.email !== undefined) { + correctEmail = ', ' + contact.email; } - contacts = sortByName(contacts); - return getContacts(contacts); + return contact.name + ', ' + newPhone + correctEmail; } /** @@ -90,12 +55,10 @@ function addContact(contacts, query) { * @returns {boolean} */ exports.add = function (phone, name, email) { - if (isValidation(phone, name) && isHave(phone)) { - if (email !== undefined) { - phoneBook.push({ 'phone': phone, 'name': name, 'email': email }); - } else { - phoneBook.push({ 'phone': phone, 'name': name, 'email': '' }); - } + if (isValidation(phone, name, email) && isHave(phone)) { + phoneBook.push({ 'phone': phone.toString(), + 'name': name, + 'email': email }); return true; } @@ -111,21 +74,15 @@ exports.add = function (phone, name, email) { * @returns {boolean} */ exports.update = function (phone, name, email) { - if (!isValidation(phone, name)) { + if (!isValidation(phone, name, email)) { return false; } for (var i = 0; i < phoneBook.length; i++) { - if (phoneBook[i].phone === phone && name && email !== undefined) { + if (phoneBook[i].phone === phone.toString()) { phoneBook[i].name = name; phoneBook[i].email = email; - return true; - } - if (phoneBook[i].phone === phone && name) { - phoneBook[i].name = name; - phoneBook[i].email = ''; - return true; } } @@ -139,34 +96,12 @@ exports.update = function (phone, name, email) { * @returns {number} */ exports.findAndRemove = function (query) { - var count = 0; - var len = phoneBook.length; - if (!query) { - - return count; - } - if (query === '*') { - for (var j = 0; j < len; j++) { - phoneBook.shift(); - count++; - } - - return count; - } - count = phoneBook.length; - phoneBook = phoneBook.filter(function (obj) { - if (obj.phone.indexOf(query) === -1 && - obj.name.indexOf(query) === -1 && - obj.email.indexOf(query) === -1) { - - return true; - } - - return false; + var contactsWithQuery = exports.find(query); + phoneBook = phoneBook.filter(function (contacts) { + return contactsWithQuery.indexOf(getContact(contacts)) === -1; }); - - return count - phoneBook.length; + return contactsWithQuery.length; }; /** @@ -176,23 +111,23 @@ exports.findAndRemove = function (query) { */ exports.find = function (query) { var contacts = []; - var len = phoneBook.length; - if (!query) { + if (query === '') { return contacts; } if (query === '*') { - for (var j = 0; j < len; j++) { - contacts.push(phoneBook[j]); - } - contacts = sortByName(contacts); - contacts = getContacts(contacts); + contacts = phoneBook.map(getContact).sort(); return contacts; } - contacts = addContact(contacts, query); + contacts = phoneBook.filter(function (item) { + return item.phone.toString().indexOf(query) !== -1 || + item.name.indexOf(query) !== -1 || + (item.email !== undefined && + item.email.indexOf(query) !== -1); + }); - return contacts; + return contacts.map(getContact).sort(); }; /**

AltStyle によって変換されたページ (->オリジナル) /