From 0074f162abb32973fbcfc8927a0b548235cbebb8 Mon Sep 17 00:00:00 2001 From: Matvey Date: 2016年10月14日 21:56:43 +0500 Subject: [PATCH 1/3] 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 2/3] 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 3/3] 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 によって変換されたページ (->オリジナル) /