From 9d265dbe37503b90d424987970d355da62e328c5 Mon Sep 17 00:00:00 2001 From: Arthur Liss Date: Wed, 12 Oct 2016 20:42:39 +0500 Subject: [PATCH 1/9] implement the requirements --- phone-book.js | 131 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 128 insertions(+), 3 deletions(-) diff --git a/phone-book.js b/phone-book.js index 69fb468..cba1b7b 100644 --- a/phone-book.js +++ b/phone-book.js @@ -6,10 +6,34 @@ */ exports.isStar = true; + /** * Телефонная книга */ -var phoneBook; +var phoneBook = []; +exports.read = function(){return phoneBook} + + +/** + * Являются ли переданные значения корректными + * для добавления в телефонную книгу + */ +function areValuesValid(phone, name, email) { + if (typeof phone !== 'string' || !/^\d{10}$/.test(phone)) { + return false; + } + + if (typeof name !== 'string') { + return false; + } + + if (typeof email !== 'string' && typeof email !== 'undefined') { + return false; + } + + return true; +} + /** * Добавление записи в телефонную книгу @@ -18,9 +42,19 @@ var phoneBook; * @param {String} email */ exports.add = function (phone, name, email) { + if (!areValuesValid(phone, name, email)) { + return false; + } + + if (phoneBook.hasOwnProperty(phone)) { + return false; + } + phoneBook[phone] = [name, email]; + return true; }; + /** * Обновление записи в телефонной книге * @param {String} phone @@ -28,25 +62,97 @@ exports.add = function (phone, name, email) { * @param {String} email */ exports.update = function (phone, name, email) { + if (!areValuesValid(phone, name, email)) { + return false; + } + + if (!phoneBook.hasOwnProperty(phone)) { + return false; + } + phoneBook[phone] = [name, email]; + return true; }; + +/** + * Вернуть все телефоны, записи о которых подпадают под запрос + * @param {String} query + */ +function findPhones(query) { + if (query === '') + return []; + + var results = []; + Object.keys(phoneBook).forEach(function(phone) { + var name = phoneBook[phone][0]; + var email = phoneBook[phone][1]; + if (query == '*' || + phone.indexOf(query) != -1 || + name.indexOf(query) != -1 || + email !== undefined && email.indexOf(query) != -1) { + results.push(phone); + } + }); + return results; +} + + /** * Удаление записей по запросу из телефонной книги * @param {String} query */ exports.findAndRemove = function (query) { - + var phonesToRemove = findPhones(query); + var newPhoneBook = []; + Object.keys(phoneBook).forEach(function(phone) { + if (phonesToRemove.indexOf(phone) != -1) { + newPhoneBook[phone] = phoneBook[phone]; + } + }); + phoneBook = newPhoneBook; + return phonesToRemove.length; }; + +/** + * Оторматировать телефон для вывода + * @param {String} phone + */ +function formatPhone(phone) { + return ( + '+7 (' + phone.slice(0, 3) + + ') ' + phone.slice(3, 6) + + '-' + phone.slice(6, 8) + + '-' + phone.slice(8)); +} + + /** * Поиск записей по запросу в телефонной книге * @param {String} query */ exports.find = function (query) { + var phonesToReturn = findPhones(query); + var results = []; + phonesToReturn.forEach(function(phone) { + var name = phoneBook[phone][0]; + var email = phoneBook[phone][1]; + var result = [name, formatPhone(phone)]; + if (email !== undefined) { + result.push(email); + } + results.push(result); + }); + results.sort(function(a, b) { return a[0].localeCompare(b[0]); }); + Object.keys(results).forEach(function(key) { + results[key] = results[key].join(', '); + }); + return results; }; + /** * Импорт записей из csv-формата * @star @@ -57,6 +163,25 @@ exports.importFromCsv = function (csv) { // Парсим csv // Добавляем в телефонную книгу // Либо обновляем, если запись с таким телефоном уже существует + if (typeof csv !== 'string') + return 0; + + var successfulWrites = 0; + var rows = csv.split('\n'); + rows.forEach(function(row) { + var values = row.split(';'); + if (values.length != 2 && values.length != 3) { + return; + } + var name = values[0]; + var phone = values[1]; + var email = values[2]; + + if (!exports.add(phone, name, email) && !exports.update(phone, name, email)) { + return; + } + successfulWrites++; + }); - return csv.split('\n').length; + return successfulWrites; }; From c9118f5e629d0767d8c6e468e0d2ccaae7cd8105 Mon Sep 17 00:00:00 2001 From: Arthur Liss Date: Wed, 12 Oct 2016 21:05:12 +0500 Subject: [PATCH 2/9] fix styling issues --- phone-book.js | 57 +++++++++++++++++++++++++++++++++------------------ 1 file changed, 37 insertions(+), 20 deletions(-) diff --git a/phone-book.js b/phone-book.js index cba1b7b..a59c13e 100644 --- a/phone-book.js +++ b/phone-book.js @@ -11,12 +11,15 @@ exports.isStar = true; * Телефонная книга */ var phoneBook = []; -exports.read = function(){return phoneBook} /** * Являются ли переданные значения корректными * для добавления в телефонную книгу + * @param {String} phone + * @param {String} name + * @param {String} email + * @returns {Boolean} - корректны ли значения */ function areValuesValid(phone, name, email) { if (typeof phone !== 'string' || !/^\d{10}$/.test(phone)) { @@ -40,6 +43,7 @@ function areValuesValid(phone, name, email) { * @param {String} phone * @param {String} name * @param {String} email + * @returns {Boolean} - завершилась ли операция успешно */ exports.add = function (phone, name, email) { if (!areValuesValid(phone, name, email)) { @@ -51,6 +55,7 @@ exports.add = function (phone, name, email) { } phoneBook[phone] = [name, email]; + return true; }; @@ -60,6 +65,7 @@ exports.add = function (phone, name, email) { * @param {String} phone * @param {String} name * @param {String} email + * @returns {Boolean} - завершилась ли операция успешно */ exports.update = function (phone, name, email) { if (!areValuesValid(phone, name, email)) { @@ -71,6 +77,7 @@ exports.update = function (phone, name, email) { } phoneBook[phone] = [name, email]; + return true; }; @@ -78,22 +85,24 @@ exports.update = function (phone, name, email) { /** * Вернуть все телефоны, записи о которых подпадают под запрос * @param {String} query + * @returns {Array} - массив телефонов, подходящих под запрос */ -function findPhones(query) { +function findPhones (query) { if (query === '') return []; var results = []; - Object.keys(phoneBook).forEach(function(phone) { + Object.keys(phoneBook).forEach(function (phone) { var name = phoneBook[phone][0]; var email = phoneBook[phone][1]; - if (query == '*' || - phone.indexOf(query) != -1 || - name.indexOf(query) != -1 || - email !== undefined && email.indexOf(query) != -1) { + if (query === '*' || + phone.indexOf(query) !== -1 || + name.indexOf(query) !== -1 || + email !== undefined && email.indexOf(query) !== -1) { results.push(phone); } }); + return results; } @@ -101,16 +110,18 @@ function findPhones(query) { /** * Удаление записей по запросу из телефонной книги * @param {String} query + * @returns {Number} - сколько записей было удалено */ exports.findAndRemove = function (query) { var phonesToRemove = findPhones(query); var newPhoneBook = []; - Object.keys(phoneBook).forEach(function(phone) { - if (phonesToRemove.indexOf(phone) != -1) { + Object.keys(phoneBook).forEach(function (phone) { + if (phonesToRemove.indexOf(phone) !== -1) { newPhoneBook[phone] = phoneBook[phone]; } }); phoneBook = newPhoneBook; + return phonesToRemove.length; }; @@ -118,25 +129,27 @@ exports.findAndRemove = function (query) { /** * Оторматировать телефон для вывода * @param {String} phone + * @returns {String} - отформатированный телефон */ -function formatPhone(phone) { +function formatPhone (phone) { return ( - '+7 (' + phone.slice(0, 3) - + ') ' + phone.slice(3, 6) - + '-' + phone.slice(6, 8) - + '-' + phone.slice(8)); + '+7 (' + phone.slice(0, 3) + + ') ' + phone.slice(3, 6) + + '-' + phone.slice(6, 8) + + '-' + phone.slice(8)); } /** * Поиск записей по запросу в телефонной книге * @param {String} query + * @returns {Array} - список строк, содержащих информацию об искомых записях */ exports.find = function (query) { var phonesToReturn = findPhones(query); var results = []; - phonesToReturn.forEach(function(phone) { + phonesToReturn.forEach(function (phone) { var name = phoneBook[phone][0]; var email = phoneBook[phone][1]; var result = [name, formatPhone(phone)]; @@ -145,10 +158,13 @@ exports.find = function (query) { } results.push(result); }); - results.sort(function(a, b) { return a[0].localeCompare(b[0]); }); - Object.keys(results).forEach(function(key) { + results.sort(function (a, b) { + return a[0].localeCompare(b[0]); + }); + Object.keys(results).forEach(function (key) { results[key] = results[key].join(', '); }); + return results; }; @@ -163,14 +179,15 @@ exports.importFromCsv = function (csv) { // Парсим csv // Добавляем в телефонную книгу // Либо обновляем, если запись с таким телефоном уже существует - if (typeof csv !== 'string') + if (typeof csv !== 'string') { return 0; + } var successfulWrites = 0; var rows = csv.split('\n'); - rows.forEach(function(row) { + rows.forEach(function (row) { var values = row.split(';'); - if (values.length != 2 && values.length != 3) { + if (values.length !== 2 && values.length !== 3) { return; } var name = values[0]; From 09cefca5852f1a7a6a8b4e2b03474da8c28dd7b4 Mon Sep 17 00:00:00 2001 From: Arthur Liss Date: Wed, 12 Oct 2016 21:07:03 +0500 Subject: [PATCH 3/9] fix styling issues --- phone-book.js | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/phone-book.js b/phone-book.js index a59c13e..b1d4711 100644 --- a/phone-book.js +++ b/phone-book.js @@ -55,7 +55,7 @@ exports.add = function (phone, name, email) { } phoneBook[phone] = [name, email]; - + return true; }; @@ -77,7 +77,7 @@ exports.update = function (phone, name, email) { } phoneBook[phone] = [name, email]; - + return true; }; @@ -87,9 +87,10 @@ exports.update = function (phone, name, email) { * @param {String} query * @returns {Array} - массив телефонов, подходящих под запрос */ -function findPhones (query) { - if (query === '') +function findPhones(query) { + if (query === '') { return []; + } var results = []; Object.keys(phoneBook).forEach(function (phone) { @@ -102,7 +103,7 @@ function findPhones (query) { results.push(phone); } }); - + return results; } @@ -121,7 +122,7 @@ exports.findAndRemove = function (query) { } }); phoneBook = newPhoneBook; - + return phonesToRemove.length; }; @@ -131,7 +132,7 @@ exports.findAndRemove = function (query) { * @param {String} phone * @returns {String} - отформатированный телефон */ -function formatPhone (phone) { +function formatPhone(phone) { return ( '+7 (' + phone.slice(0, 3) + ') ' + phone.slice(3, 6) + @@ -164,7 +165,7 @@ exports.find = function (query) { Object.keys(results).forEach(function (key) { results[key] = results[key].join(', '); }); - + return results; }; From 39170dd973a1df66a66d01f4b1816ce9086d030c Mon Sep 17 00:00:00 2001 From: Arthur Liss Date: Wed, 12 Oct 2016 21:09:31 +0500 Subject: [PATCH 4/9] set isStar to false --- phone-book.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phone-book.js b/phone-book.js index b1d4711..5a81457 100644 --- a/phone-book.js +++ b/phone-book.js @@ -4,7 +4,7 @@ * Сделано задание на звездочку * Реализован метод importFromCsv */ -exports.isStar = true; +exports.isStar = false; /** From 02e8bd96a1dc9008e0046c9575399422e9d33967 Mon Sep 17 00:00:00 2001 From: Arthur Liss Date: Wed, 12 Oct 2016 21:26:59 +0500 Subject: [PATCH 5/9] try to not accept empty strings as values --- phone-book.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/phone-book.js b/phone-book.js index 5a81457..51fd49b 100644 --- a/phone-book.js +++ b/phone-book.js @@ -26,11 +26,11 @@ function areValuesValid(phone, name, email) { return false; } - if (typeof name !== 'string') { + if (typeof name !== 'string' || name === '') { return false; } - if (typeof email !== 'string' && typeof email !== 'undefined') { + if ((typeof email !== 'string' || email === '') && typeof email !== 'undefined') { return false; } From 5455ad38d791f370fa3abaa0de0ee7cb49a89a39 Mon Sep 17 00:00:00 2001 From: Arthur Liss Date: Wed, 12 Oct 2016 21:33:55 +0500 Subject: [PATCH 6/9] work around the complexity issue --- phone-book.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/phone-book.js b/phone-book.js index 51fd49b..69c6bfa 100644 --- a/phone-book.js +++ b/phone-book.js @@ -13,6 +13,11 @@ exports.isStar = false; var phoneBook = []; +function isNonEmptyString(value) { + return typeof value === 'string' && value != ''; +} + + /** * Являются ли переданные значения корректными * для добавления в телефонную книгу @@ -22,15 +27,15 @@ var phoneBook = []; * @returns {Boolean} - корректны ли значения */ function areValuesValid(phone, name, email) { - if (typeof phone !== 'string' || !/^\d{10}$/.test(phone)) { + if (!isNonEmptyString(phone) || !/^\d{10}$/.test(phone)) { return false; } - if (typeof name !== 'string' || name === '') { + if (!isNonEmptyString(name)) { return false; } - if ((typeof email !== 'string' || email === '') && typeof email !== 'undefined') { + if (!isNonEmptyString(email) && typeof email !== 'undefined') { return false; } From f8e82f7a8943d871aa1c37bc63b1c4073331c275 Mon Sep 17 00:00:00 2001 From: Arthur Liss Date: Wed, 12 Oct 2016 21:36:27 +0500 Subject: [PATCH 7/9] change != to !== --- phone-book.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phone-book.js b/phone-book.js index 69c6bfa..88dde26 100644 --- a/phone-book.js +++ b/phone-book.js @@ -14,7 +14,7 @@ var phoneBook = []; function isNonEmptyString(value) { - return typeof value === 'string' && value != ''; + return typeof value === 'string' && value !== ''; } From 0563ed15431932ebab4ff20c31f734abb376e0da Mon Sep 17 00:00:00 2001 From: Arthur Liss Date: Wed, 12 Oct 2016 21:44:33 +0500 Subject: [PATCH 8/9] typecheck queries --- phone-book.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phone-book.js b/phone-book.js index 88dde26..4ae2883 100644 --- a/phone-book.js +++ b/phone-book.js @@ -93,7 +93,7 @@ exports.update = function (phone, name, email) { * @returns {Array} - массив телефонов, подходящих под запрос */ function findPhones(query) { - if (query === '') { + if (typeof query !== 'string' || query === '') { return []; } From 267ecd8fcffb62ceebc6fa006e3470dfa96ef0ef Mon Sep 17 00:00:00 2001 From: Arthur Liss Date: Tue, 25 Oct 2016 14:15:48 +0500 Subject: [PATCH 9/9] Proper hasOwnProperty --- phone-book.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/phone-book.js b/phone-book.js index 4ae2883..6640fd8 100644 --- a/phone-book.js +++ b/phone-book.js @@ -35,7 +35,7 @@ function areValuesValid(phone, name, email) { return false; } - if (!isNonEmptyString(email) && typeof email !== 'undefined') { + if (typeof email !== 'string' && typeof email !== 'undefined') { return false; } @@ -55,7 +55,7 @@ exports.add = function (phone, name, email) { return false; } - if (phoneBook.hasOwnProperty(phone)) { + if (Object.prototype.hasOwnProperty.call(phoneBook, phone)) { return false; } @@ -77,7 +77,7 @@ exports.update = function (phone, name, email) { return false; } - if (!phoneBook.hasOwnProperty(phone)) { + if (!Object.prototype.hasOwnProperty.call(phoneBook, phone)) { return false; }