Вход

Просмотр полной версии : Отобразить контакты в телефонной книге


Александр3297
12.12.2017, 16:30
Добрый день! Помогите разобраться, что делаю не так.

Нужно создать функцию, которая добавляет, удаляет и показывает номера в зависимости от команды.
Эти действия должны выполнятся корректно:
1.'ADD Ivan 555-10-01,555-10-03'
2.'ADD Ivan 555-10-02'
3.'REMOVE_PHONE 555-10-03'
4'ADD Alex 555-20-01'
5. 'REMOVE_PHONE 555-20-01'
6. и после команды SHOW: 'В телефонной книге: "Ivan: 555-10-01, 555-10-02"'


var phoneBook = {};
var command = 'ADD Ivan 555-10-01,555-10-03';
function (command){

function add() {
var name = command.split(' ')[1];
var numb = (command.split(' ')[2]).split(',');
if (!phoneBook.hasOwnProperty(name)) {
phoneBook[name] = {};
phoneBook[name].numbr = numb;
}
else{phoneBook[name].numbr = phoneBook[name].numbr.concat(numb); }}


function remove() {
var numb = (command.split(' ')[1]);
for (i=0; i<((phoneBook[name].numbr).length); i++){ if (phoneBook[name].numbr[i].includes(numb)) {
x = phoneBook[name].numbr[i].indexOf(numb);
phoneBook[name].numbr[i].splice(x, 1);
}}}


function show() { for (i=0; i<(Object.keys(phoneBook)).length; i++) {
var contactBook = ('В телефонной книге: ' + Object.keys(phoneBook)[i] + ': ' + (phoneBook[(Object.keys(phoneBook)[i])].numbr).join(', ') + '\n');
return contactBook;}}

if(command.split(' ')[0]=='ADD') {add();}
else if(command.split(' ')[0]=='REMOVE_PHONE') {remove();}
else if (command.split(' ')[0]=='SHOW') {show();}}

ksa
12.12.2017, 16:49
что делаю не так
Твоя программка сильно смахивает на говнокод. :(

Слишком много букав для такой простой задачки. ;)

Александр3297
12.12.2017, 17:14
еще совсем новичок, только учусь

рони
12.12.2017, 18:02
Александр3297,
<!DOCTYPE html>

<html>
<head>
<title>Untitled</title>
<meta charset="utf-8">


</head>

<body>
<script>
var phoneBook = {};
var methods = {};
methods.add = function(name, arr) {
if (!this.hasOwnProperty(name)) {
this[name] = {"numbr":[]};
}
var numbr = this[name].numbr;
arr = arr.trim().split(/,/);
arr.forEach(function(tel) {
if (numbr.indexOf(tel) == -1) {
numbr.push(tel);
}
});
return this;
};
methods.remove_phone = function(arr) {
var that = this;
arr = arr.trim().split(/,/);
Object.keys(that).forEach(function(name) {
var numbr = that[name].numbr;
arr.forEach(function(tel) {
var indx = numbr.indexOf(tel);
if (indx !== -1) {
numbr.splice(indx, 1);
}
});
if (!numbr.length) {
delete that[name];
}
});
return this;
};
methods.show = function() {
document.body.insertAdjacentHTML("beforeEnd", "<div>" + JSON.stringify(this) + "</div>");
return this
}
function fn(command) {
command = command.trim().split(/\s+/);
var method = command[0].toLowerCase();
if (methods[method]) {
methods[method].apply(phoneBook, command.slice(1));
}
};

var command = "ADD Ivan 555-10-01,555-10-03";
fn(command);
fn("SHOW");
command = "ADD Ivan 555-10-02";
fn(command);
fn("SHOW");
command = "REMOVE_PHONE 555-10-03";
fn(command);
fn("SHOW");
command = "ADD Alex 555-20-01";
fn(command);
fn("SHOW");
command = "REMOVE_PHONE 555-20-01";
fn(command);
fn("SHOW");




</script>

</body>
</html>

Александр3297
14.12.2017, 00:02
рони, Добрый вечер, все мучаюсь с этой задачей, не могу сообразить. В предложенном вами решением некоторые моменты мне непонятны еще :blink:
Если вам не сложно, посмотрите мой код.
У меня получился следующий код:
function (command) {
// команда add
if (command.split(' ')[0] =='ADD' ){
var name = command.split(' ')[1];
var numb = (command.split(' ')[2]).split(',');
if(!phoneBook.hasOwnProperty(name)) {
phoneBook[name] = [];
phoneBook[name] = numb;}
else {phoneBook[name] = numb.concat(numb)}
}

// команда remove
if (command.split(' ')[0] =='REMOVE_PHONE' ){
var numb = (command.split(' ')[1]);
if( phoneBook[name].indexOf(numb)!==-1){
var x = phoneBook[name].indexOf(numb);
phoneBook[name].splice(x, 1);
}
}

// команда show

if (command.split(' ')[0] =='SHOW'){
var book = [];
for (i=0; i<(Object.keys(phoneBook)).length; i++){
var key = Object.keys(phoneBook)[i];
book[i] = [key + ': ' + phoneBook[key]];
}}}

По отдельности эти команды работают, но я не понимаю как через функцию function (command) пополнять и отображать телефонную книгу, задавая command:
var command = 'ADD Ivan 555-10-01,555-10-03';
alert(re(command));// alert выдает underfind
command = 'ADD Ivan 555-10-02';
command = 'REMOVE_PHONE 555-10-03';
command = 'ADD Alex 555-20-01';
command = 'REMOVE_PHONE 555-20-01';
command = 'SHOW';

По условиям задачи:
Команда ADD добавляет контакт в телефонную книгу со списком телефонов. Телефоны перечисляются через запятую. Если такой контакт существует, то команда пополняет список телефонов контакта

Команда REMOVE_PHONE удаляет телефон из телефонной книги. Если телефон успешно удален, то функция должна вернуть true. Если такого телефона в телефонной книге не существует, то возвращается false.

Команда SHOW возвращает массив контактов с их телефонами. Массив содержит строчки вида: "Имя: Телефон1, Телефон2". Массив должен быть отсортирован по имени контакта. Телефоны идут в порядке добавления их в телефонную книгу. Контакт с пустым списком телефонов не должен возвращаться.

рони
14.12.2017, 00:18
alert выдает underfind
строка 10 ничего не возвращает

команда remove откуда
name прилетит в строку 15?

где имя re в строке 1?

Александр3297
14.12.2017, 00:35
рони,
В самом начале кода не вставил
var phoneBook = {};
На счет re увидел, поправил.
На счет remove я полагал, что раз работаю с объектом phoneBook, то и к имени обращаюсь оттуда соответственно.

А по поводу того, что строка 10 ничего не возвращает не сообразить
Попробовал так:
...
else {phoneBook[name] = numb.concat(numb)}
return Object.keys(phoneBook) + ': ' + phoneBook[name];
}
Функция стала вызываться, но странно, первая команда работает, а вторая затирает контакты первой строки (var command = 'ADD Ivan 555-10-01,555-10-03'; и добавляет номер из второй команды дважды, вместо того, чтобы добавить номер.

Команда SHOW выдает underfind а на REMOVE вообще никак не реагирует.

рони
14.12.2017, 10:57
На счет remove я полагал, что раз работаю с объектом phoneBook, то и к имени обращаюсь оттуда соответственно.
нет у вас name, поэтому надо проверять все ключи phoneBook циклом, и в каждом name опять циклом все телефоны в numb на совпадение и удалять если есть по индексу

Александр3297
14.12.2017, 13:48
рони,
Спасибо большое за подсказки!
Практически все работает, вот что получилось
var phoneBook = {};
function re (command) {
// команда add
if (command.split(' ')[0] =='ADD' ){
var name = command.split(' ')[1];
var numb = (command.split(' ')[2]).split(',');
if(!phoneBook.hasOwnProperty(name)) {
phoneBook[name] = numb;}
else {phoneBook[name] = phoneBook[name].concat(numb);
}
return Object.keys(phoneBook) + ': ' + phoneBook[name];
}

// команда remove
else if (command.split(' ')[0] =='REMOVE_PHONE' ){
var numb = (command.split(' ')[1]);
for (i=0; i<Object.keys(phoneBook).length; i++){
var key = Object.keys(phoneBook)[i];
for (j=0;j<phoneBook[key].length; j++){
if (phoneBook[key][j] = numb){
var x = phoneBook[key][j].indexOf(numb);
phoneBook[key].splice(x, 1);
return true;}
else return false;
} }}

// команда show

if (command.split(' ')[0] =='SHOW'){
var book = [];
for (i=0; i<(Object.keys(phoneBook)).length; i++){
var key = Object.keys(phoneBook)[i];
book[i] = [key + ': ' + phoneBook[key] + '\n'];
return book;
}}}



alert(re('ADD Ivan 223232'));
alert(re('ADD Ivan 555-10-01,555-10-03'));
alert(re('SHOW'))
alert (re('REMOVE_PHONE 550-10-01'))
alert (re('ADD Alex 544545'))// Вот тут ерунда получается (Ivan, Alex: 544545)
alert(re('SHOW'))// а тут показывает номера ивана без удаленного

Как думаете, в чем причина может быть?в функции Add?

рони
14.12.2017, 14:13
Александр3297,
20 строка ???

Александр3297
14.12.2017, 15:07
рони,
Функция remove корректно реагирует на проверки.
Только при добавлении нового имени с номером предыдущее затирается как будто, получается phoneBook содержит все время одно имя и вот эту проблему не понимаю как исправить:(

рони
14.12.2017, 15:47
Александр3297,
var phoneBook = {};
function re (command) {
// команда add
if (command.split(' ')[0] =='ADD' ){
var name = command.split(' ')[1];
var numb = (command.split(' ')[2]).split(',');
if(!phoneBook.hasOwnProperty(name)) {
phoneBook[name] = numb;}
else {phoneBook[name] = phoneBook[name].concat(numb);
}
return name + " : " +JSON.stringify(phoneBook[name]);
}

// команда remove
else if (command.split(' ')[0] =='REMOVE_PHONE' ){
var tel = (command.split(' ')[1]),
arrName = Object.keys(phoneBook);
for (i=0; i< arrName.length; i++){
var name = arrName[i];
var numb = phoneBook[name];
var indx = numb.indexOf(tel)
if(indx !== -1) {
numb.splice(indx, 1);
if(!numb.length) delete phoneBook[name]
return true
}
}
return false;
}

// команда show

if (command.split(' ')[0] =='SHOW'){

return JSON.stringify(phoneBook);
}

}
alert(re('ADD Ivan 223232'));
alert(re('ADD Ivan 555-10-01,555-10-03'));
alert(re('SHOW'))
alert (re('REMOVE_PHONE 550-10-01'))
alert (re('ADD Alex 544545'))// Вот тут ерунда получается (Ivan, Alex: 544545)
alert(re('SHOW'))// а тут показывает номера ивана без удаленного

Dilettante_Pro
14.12.2017, 15:53
Исправленный вариант Александр3297
var phoneBook = {};
function re (command) {
// команда add
if (command.split(' ')[0] =='ADD' ){
var name = command.split(' ')[1];
var numb = (command.split(' ')[2]).split(',');
if(!phoneBook.hasOwnProperty(name)) {
phoneBook[name] = numb;
return phoneBook[name];
}
else {
phoneBook[name] = phoneBook[name].concat(numb);
return Object.keys(phoneBook) + ': ' + phoneBook[name];
}
}

// команда remove
else if (command.split(' ')[0] =='REMOVE_PHONE' ){
var numb = (command.split(' ')[1]);
for (i=0; i<Object.keys(phoneBook).length; i++){
var key = Object.keys(phoneBook)[i];
for (j=0;j<phoneBook[key].length; j++){
if(phoneBook[key][j] == numb) {
phoneBook[key].splice(j, 1);
return true;
}
}
return false;
}
}

// команда show

if (command.split(' ')[0] =='SHOW'){
var book = [];
for (i=0; i<(Object.keys(phoneBook)).length; i++){
var key = Object.keys(phoneBook)[i];
book[i] = [key + ': ' + phoneBook[key] + '\n'];
}
return book;
}
}
alert(re('ADD Ivan 223232'));
alert(re('ADD Ivan 555-10-01,555-10-03'));
alert(re('SHOW'));
alert (re('REMOVE_PHONE 555-10-01'));
alert (re('ADD Alex 544545')) ;
alert(re('SHOW'));

Александр3297
14.12.2017, 15:56
рони,
Спасибо большое за вашу помощь!:)

Dilettante_Pro
14.12.2017, 15:58
рони,
Что-то у вас не тот номер удалился....
alert (re('REMOVE_PHONE 550-10-01'))
- такой не записывался

До удаления
Ivan : ["223232","555-10-01","555-10-03"]
После удаления
Ivan:["223232","555-10-01"]

Александр3297
14.12.2017, 16:03
Dilettante_Pro,
Спасибо!!

рони
14.12.2017, 16:41
Dilettante_Pro, :thanks:
минус пропустил в строке 22

if(indx !== -1)

пост №12 исправлено

Nexus
15.12.2017, 23:47
В результате моего поверхностного изучения ES6 родилось это (Автору вряд ли подойдет, но смысл схож):
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<title>CLI</title>
<style>
body{
background:#333;
color:#FFF;
font-size:16px;
line-height:20px;
}
.command-line{
position:relative;
padding-left:50px;
}
.command-line input,.command-line input:focus,#console{
width:100%;
color:inherit;
font-size:inherit;
font-family:inherit;
background:transparent;
border:none;
outline:none;
cursor:default;
}
.command-line:before{
content:'[root]#';
position:absolute;
left:0;
}
#console{
display:block;
padding:0;
margin:0;
}
.error{
color:red;
}
</style>
<script type="text/javascript">
var INPUT,
CONSOLE,
__history=[],
__history_pos=0;

document.addEventListener('DOMContentLoaded',funct ion(){
var classes=['PhoneBook'],
functions=['clear'];

INPUT=document.getElementById('command-line');
CONSOLE=document.getElementById('console');

if(!INPUT || !CONSOLE)
throw new Error('Missing one or more required HTMLElements');

INPUT.addEventListener('blur',()=>INPUT.focus());

INPUT.addEventListener('keydown',(e)=>{
var keyCode=e.keyCode||e.charCode,
offset=__history.length-__history_pos-1+2*(keyCode==40),
val=__history[offset];

if([38,40].indexOf(keyCode)<0)
return;

e.preventDefault();
if(offset<0)
return;
else if(!val)
val='';

INPUT.value=val;
__history_pos=val?__history.length-offset:0;
});

INPUT.parentNode.addEventListener('submit',(e)=>{
e.preventDefault();

var command=INPUT.value;

__history.push(command);
__history_pos=0;

CONSOLE.innerHTML+=command+'\n';
INPUT.value='';

command=command.trim().split(' ').map(i=>i.trim()).filter(i=>!!i.length);
if(!command.length)
return;

var containers=[classes,functions],
find_function;

if(find_function=command.length==1)
containers=containers.reverse();

var name=command.shift(),
index;

for(var i in containers){
if(!containers.hasOwnProperty(i) || (index=containers[i].indexOf(name))<0)
continue;

try{
var res;
if(i==0 && find_function)
res=window[containers[i][index]](...command);
else{
var _class=eval(`new ${containers[i][index]}()`),
method=command.shift();

if(!method)
break;

if(typeof _class[method]!='function')
throw new Error(`Method «${method}» not found in class «${containers[i][index]}»`);

res=_class[method](...command);
};

if(typeof res=='string')
CONSOLE.innerHTML+=res+'\n';

}catch(e){
CONSOLE.innerHTML+=`<span class="error">${e.message}</span>`+'\n';
};

break;
};
});
});

function clear(){
CONSOLE.innerHTML='Cleared\n';
}

var __PhoneBook_pseudo_db={};
class PhoneBook{
constructor(){
this._list=__PhoneBook_pseudo_db;
}

get __list(){
if(!(this instanceof PhoneBook))
throw new Error('Illegal invocation');

return this._list;
}

set __list(list){
if(!(this instanceof PhoneBook))
throw new Error('Illegal invocation');

this._list=list;

return this;
}

show(){
var row_sep='---------------------\n',
result='Name\t\tPhone(s)\n'+row_sep;

for(var name in this._list)
result+=`${name}\t\t${this._list[name].join(', ')}\n`+row_sep;

return result;
}

add(...args){
var name=args.shift();
this._list[name]=(this._list[name]||[]).concat(...args);

return 'Added';
}

remove(...args){
for(var name of args)
delete this._list[name];

return 'Removed';
}

edit(...args){
this._list[args.shift()]=args;

return 'Edited';
}

clear(){
this._list={};

return 'Cleared';
}
};
</script>
</head>
<body>
<pre id="console"></pre>
<div class="command-line">
<form><input id="command-line" type="text" autofocus autocomplete="off"/></form>
</div>
</body>
</html>