forked from urfu-2015/javascript-tasks-2
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathphoneBook.js
More file actions
180 lines (168 loc) · 6.86 KB
/
phoneBook.js
File metadata and controls
180 lines (168 loc) · 6.86 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
'use strict';
var phoneBook = []; // Здесь вы храните записи как хотите
/*
Функция добавления записи в телефонную книгу.
На вход может прийти что угодно, будьте осторожны.
*/
module.exports.add = function add(name, phone, email) {
var isNameValid = (name.length > 0);
var isEmailValid = ((email.indexOf('@') !== -1) &&
(email.indexOf('@') === email.lastIndexOf('@')) &&
(email.indexOf('.') !== -1));
var isPhoneValid = false;
if (isEmailValid) {
var phoneInFormat = checkPhoneValidity(phone);
if (phoneInFormat) {
var phoneLength = phoneInFormat.length;
var phoneWithSpaces = phoneInFormat.slice(0, phoneLength - 10) + ' (' +
phoneInFormat.substr(phoneLength - 10, 3) + ') ' +
phoneInFormat.substr(phoneLength - 7, 3) + '-' +
phoneInFormat.substr(phoneLength - 4, 1) + '-' +
phoneInFormat.substr(phoneLength - 3);
isPhoneValid = phoneInFormat;
}
}
if (isNameValid && isEmailValid && isPhoneValid) {
phoneBook.push({name: name, phone: phoneInFormat, phone2: phoneWithSpaces, email: email});
}
return isNameValid && isEmailValid && isPhoneValid;
};
/*
Функция проверки валидности телефонного номера.
*/
function checkPhoneValidity(phone) {
var count;
var phoneInFormat = '';
var areBracketsOpened = false;
var numbers = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];
var validSymbols = ['(', ')', ' ', '-', '+'];
for (count = 0; count < phone.length; count++) {
if ((numbers.indexOf(phone[count]) === -1) &&
(validSymbols.indexOf(phone[count]) === -1)) {
return null;
}
if (numbers.indexOf(phone[count]) !== -1) {
phoneInFormat = phoneInFormat + phone[count];
}
if (phone[count] === '(') {
if (phoneInFormat.length === 1) {
areBracketsOpened = true;
} else {
return null;
}
}
if ((phone[count] === ')' && (!areBracketsOpened || phoneInFormat.length !== 4)) ||
(phone[count] === '+' && phoneInFormat.length > 0) ||
(phone[count] === '-' && phoneInFormat.length < 6)) {
return null;
}
if (phone[count] === ')') {
areBracketsOpened = false;
}
}
if (areBracketsOpened || phoneInFormat.length < 10) {
return null;
}
phoneInFormat = (phoneInFormat.length === 10) ? '+7' + phoneInFormat : '+' + phoneInFormat;
return phoneInFormat;
}
/*
Функция поиска записи в телефонную книгу.
Поиск ведется по всем полям.
*/
module.exports.find = function find(query) {
if (!query) {
query = '';
}
var currentRecord;
for (currentRecord = 0; currentRecord < phoneBook.length; currentRecord++) {
if (isRecordSuitable(phoneBook[currentRecord], query)) {
console.log(phoneBook[currentRecord].name + ', ' +
phoneBook[currentRecord].phone2 + ', ' +
phoneBook[currentRecord].email);
}
}
};
/*
Функция удаления записи в телефонной книге.
*/
module.exports.remove = function remove(query) {
var currentRecord;
var newPhoneBook = [];
var deletedRecordsAmount = 0;
for (currentRecord = 0; currentRecord < phoneBook.length; currentRecord++) {
if (!isRecordSuitable(phoneBook[currentRecord], query)) {
newPhoneBook.push(phoneBook[currentRecord]);
} else {
deletedRecordsAmount++;
}
}
phoneBook = newPhoneBook;
console.log(deletedRecordsAmount + ' records deleted');
};
/*
Функция проверки, удовлетворяет ли запись запросу.
*/
function isRecordSuitable(record, query) {
var fields = Object.keys(record);
for (var currentField = 0; currentField < fields.length; currentField++) {
if (record[fields[currentField]].indexOf(query) !== -1) {
return true;
}
}
return false;
}
/*
Функция импорта записей из файла (задача со звёздочкой!).
*/
module.exports.importFromCsv = function importFromCsv(filename) {
var data = require('fs').readFileSync(filename, 'utf-8');
var records = data.split('\r\n');
var currentRecord;
var addedRecordsAmount = 0;
for (currentRecord = 0; currentRecord < records.length; currentRecord++) {
if (records[currentRecord].indexOf(';') !== -1) {
var fields = records[currentRecord].split(';');
var wasAdded = module.exports.add(fields[0], fields[1], fields[2]);
if (wasAdded) {
addedRecordsAmount++;
}
}
}
console.log(addedRecordsAmount + ' records added');
};
var tableHeader = [
'┌────────────────────────┬────────────────────────┬────────────────────────┐',
'│ Имя │ Телефон │ email │',
'├────────────────────────┼────────────────────────┼────────────────────────┤'
];
var tableFooter = [
'└────────────────────────┴────────────────────────┴────────────────────────┘'
];
/*
Функция вывода всех телефонов в виде ASCII (задача со звёздочкой!).
*/
var COLUMN_WIDTH = 23;
module.exports.showTable = function showTable() {
var line;
console.log(tableHeader.join('\n'));
var currentRecord;
for (currentRecord = 0; currentRecord < phoneBook.length; currentRecord++) {
var spacesAmount = 0;
var recordString = '';
var fields = ['name', 'phone2', 'email'];
var currentField;
for (currentField = 0; currentField < fields.length; currentField++) {
recordString += '│ ' + phoneBook[currentRecord][fields[currentField]];
for (spacesAmount = 0;
spacesAmount < COLUMN_WIDTH -
(phoneBook[currentRecord][fields[currentField]]).length;
spacesAmount++) {
recordString += ' ';
}
}
recordString += '│';
console.log(recordString);
}
console.log(tableFooter[0]);
};