Отобразить контакты в телефонной книге 
		
		
		
		Добрый день! Помогите разобраться, что делаю не так. 
	Нужно создать функцию, которая добавляет, удаляет и показывает номера в зависимости от команды. Эти действия должны выполнятся корректно: 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, время: 08:40. |