Отобразить контакты в телефонной книге
Добрый день! Помогите разобраться, что делаю не так.
Нужно создать функцию, которая добавляет, удаляет и показывает номера в зависимости от команды. Эти действия должны выполнятся корректно: 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();}} |
Цитата:
Слишком много букав для такой простой задачки. ;) |
еще совсем новичок, только учусь
|
Александр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> |
рони, Добрый вечер, все мучаюсь с этой задачей, не могу сообразить. В предложенном вами решением некоторые моменты мне непонятны еще :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". Массив должен быть отсортирован по имени контакта. Телефоны идут в порядке добавления их в телефонную книгу. Контакт с пустым списком телефонов не должен возвращаться. |
Цитата:
Цитата:
name прилетит в строку 15? где имя re в строке 1? |
рони,
В самом начале кода не вставил 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 вообще никак не реагирует. |
Цитата:
|
рони,
Спасибо большое за подсказки! Практически все работает, вот что получилось 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? |
Александр3297,
20 строка ??? |
рони,
Функция remove корректно реагирует на проверки. Только при добавлении нового имени с номером предыдущее затирается как будто, получается phoneBook содержит все время одно имя и вот эту проблему не понимаю как исправить:( |
Александр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'))// а тут показывает номера ивана без удаленного |
Исправленный вариант Александр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')); |
рони,
Спасибо большое за вашу помощь!:) |
рони,
Что-то у вас не тот номер удалился.... alert (re('REMOVE_PHONE 550-10-01')) - такой не записывался До удаления Ivan : ["223232","555-10-01","555-10-03"] После удаления Ivan:["223232","555-10-01"] |
Dilettante_Pro,
Спасибо!! |
Dilettante_Pro, :thanks:
минус пропустил в строке 22 if(indx !== -1) пост №12 исправлено |
В результате моего поверхностного изучения 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',function(){ 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> |
Часовой пояс GMT +3, время: 05:16. |