Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 12.12.2017, 16:30
Интересующийся
Отправить личное сообщение для Александр3297 Посмотреть профиль Найти все сообщения от Александр3297
 
Регистрация: 03.12.2017
Сообщений: 14

Отобразить контакты в телефонной книге
Добрый день! Помогите разобраться, что делаю не так.

Нужно создать функцию, которая добавляет, удаляет и показывает номера в зависимости от команды.
Эти действия должны выполнятся корректно:
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();}}
Ответить с цитированием
  #2 (permalink)  
Старый 12.12.2017, 16:49
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,217

Сообщение от Александр3297
что делаю не так
Твоя программка сильно смахивает на говнокод.

Слишком много букав для такой простой задачки.
Ответить с цитированием
  #3 (permalink)  
Старый 12.12.2017, 17:14
Интересующийся
Отправить личное сообщение для Александр3297 Посмотреть профиль Найти все сообщения от Александр3297
 
Регистрация: 03.12.2017
Сообщений: 14

еще совсем новичок, только учусь
Ответить с цитированием
  #4 (permalink)  
Старый 12.12.2017, 18:02
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

Александр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>
Ответить с цитированием
  #5 (permalink)  
Старый 14.12.2017, 00:02
Интересующийся
Отправить личное сообщение для Александр3297 Посмотреть профиль Найти все сообщения от Александр3297
 
Регистрация: 03.12.2017
Сообщений: 14

рони, Добрый вечер, все мучаюсь с этой задачей, не могу сообразить. В предложенном вами решением некоторые моменты мне непонятны еще
Если вам не сложно, посмотрите мой код.
У меня получился следующий код:
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". Массив должен быть отсортирован по имени контакта. Телефоны идут в порядке добавления их в телефонную книгу. Контакт с пустым списком телефонов не должен возвращаться.
Ответить с цитированием
  #6 (permalink)  
Старый 14.12.2017, 00:18
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

Сообщение от Александр3297
alert выдает underfind
строка 10 ничего не возвращает

Сообщение от Александр3297
команда remove
откуда
name прилетит в строку 15?

где имя re в строке 1?
Ответить с цитированием
  #7 (permalink)  
Старый 14.12.2017, 00:35
Интересующийся
Отправить личное сообщение для Александр3297 Посмотреть профиль Найти все сообщения от Александр3297
 
Регистрация: 03.12.2017
Сообщений: 14

рони,
В самом начале кода не вставил
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 вообще никак не реагирует.

Последний раз редактировалось Александр3297, 14.12.2017 в 00:57.
Ответить с цитированием
  #8 (permalink)  
Старый 14.12.2017, 10:57
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

Сообщение от Александр3297
На счет remove я полагал, что раз работаю с объектом phoneBook, то и к имени обращаюсь оттуда соответственно.
нет у вас name, поэтому надо проверять все ключи phoneBook циклом, и в каждом name опять циклом все телефоны в numb на совпадение и удалять если есть по индексу
Ответить с цитированием
  #9 (permalink)  
Старый 14.12.2017, 13:48
Интересующийся
Отправить личное сообщение для Александр3297 Посмотреть профиль Найти все сообщения от Александр3297
 
Регистрация: 03.12.2017
Сообщений: 14

рони,
Спасибо большое за подсказки!
Практически все работает, вот что получилось
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?
Ответить с цитированием
  #10 (permalink)  
Старый 14.12.2017, 14:13
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

Александр3297,
20 строка ???
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск