Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Удаление / добавление JSON (https://javascript.ru/forum/events/54484-udalenie-dobavlenie-json.html)

Alexander Belov 19.03.2015 07:31

Удаление / добавление JSON
 
Есть динамический календарь с событиями, которые записаны в виде JSON и также хранятся в localStorage:

var events = [
     {"Date":"16-3-2015",
       "Event":"MeetUp",
       "Participants":"Me, Tom, Linda",
        "Description":"Coding meet-up, California, Santa Barbara"},

     {"Date":"16-3-2015",
       "Event":"Vehicle testing",
       "Participants":"Me",
       "Description":"BMW test drive"}
];


Не получается реализовать следующее:
1) На примере выше мы видим, что дата одна и та же. Но по задумке может быть только одно событие в один день. На практике выходит так, что в JSON и localStorage запиcываются оба события, но на экран пользователя выводится то, которое было записанно позднее. Каким образом удалить первое событие из JSON и localStorage?

Пробовал
var events = localStorage.getItem('events');
events.splice(1,4);
console выдаёт Undefined is not a function

2) И каким образом реализовать изменение лишь одного из свойств объекта? Например, пользователь решил добавить в "Description" ещё некоторую информацию, не меняя остальные свойства "Date", "Event", "Participants".

По идее, нужно каким-то образом отследить изменение текста, который вводится пользователем.
if ("новый текст, который вводится пользователем" !== "тексту, сохранённому в localStorage") {
      "меняем его в JSON и сохраняем наверх предыдущего localStorage"
} 
else {
 "всё ОК, ничего не меняем"
};


Подскажите, пожалуйста, как решить такие задачи при помощи нативного Javascript.

рони 19.03.2015 08:18

Цитата:

Сообщение от Alexander Belov
var events = localStorage.getItem('events');
events.splice(1,4);

где превращение строки в массив?

Alexander Belov 19.03.2015 11:30

Цитата:

Сообщение от рони (Сообщение 362042)
где превращение строки в массив?

А разве переменная events не является массивом?

var events = [
     {"Date":"16-3-2015",
       "Event":"MeetUp",
       "Participants":"Me, Tom, Linda",
        "Description":"Coding meet-up, California, Santa Barbara"},
 
     {"Date":"16-3-2015",
       "Event":"Vehicle testing",
       "Participants":"Me",
       "Description":"BMW test drive"}
];

рони 19.03.2015 12:23

Цитата:

Сообщение от Alexander Belov
А разве переменная events не является массивом?

Цитата:

Сообщение от Alexander Belov
var events = localStorage.getItem('events');

пока только строка

рони 19.03.2015 12:25

Alexander Belov,
var events = localStorage.getItem('events')||"[]";
    events = JSON.parse(events);
    events.splice(1,4);

Alexander Belov 19.03.2015 23:07

Что-то splice() не работает, массив остаётся как есть без изменений.

рони 19.03.2015 23:12

Alexander Belov,
где код ?

Alexander Belov 19.03.2015 23:30

рони,

Функция добавления события в календарь + удаления первого из них

var addNewEvent = function() {
          var events = JSON.parse(localStorage.getItem('events')) || [];

           events.push({Date: storageNewDate, Event: storageEvent,       Participants: storageParticipants, Description: storageDescription});
            localStorage.setItem('events', JSON.stringify(events)); 

            };

            var events = localStorage.getItem('events')||"[]";
            console.log(events);
            events = JSON.parse(events);
            events.splice(1,4);


События в календаре, сохранённые и выведенные в localStorage (не меняются в не зависимости от добавления строчек 9-12 вышенаписанного кода)
[{
"Date":"16-3-2015",
"Event":"MeetUp",
"Participants":"Me, Tom, Linda",
"Description":"Coding meet-up, California, Santa Barbara"
},

{
"Date":"16-3-2015",
"Event":"Vehicle testing",
"Participants":"Me",
"Description":"BMW test driive"
}]


Функция addNewEvent срабатывает по нажатию на кнопку.

рони 20.03.2015 00:39

Alexander Belov,
для медитации
<!DOCTYPE HTML>

<html>

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

<body>
  <script>
     var addNewEvent = function(storageNewDate,storageEvent,storageParticipants,storageDescription) {
          var events =  JSON.parse(localStorage.getItem('events'))||[] ;
             events.length >= 2 && (events.length=2) //чтоб не разрастался при тесте
            //тут должна быть проверка есть ли в массиве storageNewDate
            for (var i=0; i<events.length; i++)  {if(events[i].Date == storageNewDate) {alert('было')}}

            events.push({"Date": storageNewDate, "Event": storageEvent,       "Participants": storageParticipants, "Description": storageDescription});
            localStorage.setItem('events', JSON.stringify(events));

            };

      addNewEvent(1,2,3,4) ; //добавили
      addNewEvent(5,6,7,8) ;
            document.write(localStorage.getItem('events')+'set<br>')
       addNewEvent(1,15,15,15) ; //тест на  Date

            var events = JSON.parse(localStorage.getItem('events'))||[] ;
            events.splice(0,1);  //удалили нулевой элемент
            localStorage.setItem('events', JSON.stringify(events));
     document.write(JSON.stringify(events)+"remove")
  </script>
</body>

</html>

Alexander Belov 21.03.2015 22:46

рони,
Благодарю за помощь! Но как переделать функцию не на два события, а на не ограниченное количество? На столько, сколько будет введено пользователем?

+ не понятна запись
events.length >= 2 && (events.length=2)


Почему левая часть без скобок, а правая в скобках? И зачем повторять "равно двум" в обеих частях (в левой "больше либо равно двум", в правой - "равно двум")?

рони 21.03.2015 23:16

Цитата:

Сообщение от Alexander Belov
events.length >= 2 && (events.length=2)

if (events.length >= 2 ) {events.length=2}

так понятнее ? и эта строка служебная вам ненужна
Цитата:

Сообщение от Alexander Belov
Но как переделать функцию не на два события, а на не ограниченное количество? На столько, сколько будет введено пользователем?

функция пока ни на какое количество не сделана - это просто демонстрация, которая вас может быть на что-то натолкнёт.
вашей информации недостаточно чтоб сделать полноценную функцию и похоже вам в раздел работа.

Alexander Belov 21.03.2015 23:41

Теперь понятно.

Буду искать решение.

Alexander Belov 01.05.2015 22:45

Помогите, пожалуйста, разобраться в ситуации.
Ниже написан код, которые добавляет объекты в localStorage при условии, что в самом хранилище уже что-то есть.
Если там ничего нет, - в коде это строка if (myStorage.length == 0) {};
(тестирую, очистив предварительно localStorage), - то консоль выдаёт ошибку Uncaught SyntaxError: Unexpected end of input.

Интересует:
1) Почему строка с переменной var events = localStorage.getItem('events') || [];
не определяет пустой массив, если в localStorage ещё нет 'events'?

2) Как создать и прописать условие для if (myStorage.length == 0) {}; чтобы там создавался в localStorage пустой массив, если нет ещё сохранённых данных.
Оставил в коде специально пустое место после фигурных скобок.

Пробовал:
1) var myStorage = [];
2) var myStorage = myStorage.push({Date: "", Event: "", Participants: "", Description: ""});
localStorage.setItem('myStorage', JSON.stringify(myStorage));

P.S. Важная часть начинается с var events...

if (tdAttr) {

                        tdAttr.style.backgroundColor = 'green';
                        tdAttr.getElementsByTagName("span")[0].innerHTML = fastAddEvent.value;


                         var fastDate = tdAttr.getAttribute('data-cell');
                         var fastEvent = fastAddEvent.value;

                         var events = localStorage.getItem('events') || [];
                         

                          var addFastEvent = function() {
                        
                            var myStorage = JSON.parse(events);
           

                            if (myStorage.length == 0) {
                                
                            }

                            else if (myStorage.length > 0) {
     

                              for (var i = 0; i < myStorage.length; i++) {
      
                                  if (myStorage[i].Date == fastDate) {
                    
                                      myStorage[i].Event = fastEvent;
                                      myStorage[i].Participants = "";
                                      myStorage[i].Description = "";
                                
                                  };


                                  break;

                              };

  

                            };

                              localStorage.setItem('events', JSON.stringify(myStorage));


                          };

                          addFastEvent();
                      };

рони 01.05.2015 23:21

Alexander Belov,
строка 10 где кавычки потеряли? "[]"

Alexander Belov 01.05.2015 23:41

Цитата:

Сообщение от рони (Сообщение 369029)
Alexander Belov,
строка 10 где кавычки потеряли? "[]"

Кавычки - это для строки, если я правильно понимаю. С кавычками ошибка исчезает. Но не очень понятно, почему не создаётся объект, если без кавычек.

У меня аналогичный коды выше. Там потом в такую же переменную добавляются события посредством
events.push({Date: storageNewDate, Event: storageEvent, Participants: storageParticipants, Description: storageDescription});


Т.е., в объект мы передаём значения. И там была так же объявлена переменная:
var events = JSON.parse(localStorage.getItem('events')) || [];
Если там скобки взять в кавычки, то метод push() не будет работать.

рони 01.05.2015 23:46

Alexander Belov,
вы запутались
либо
var events = JSON.parse(localStorage.getItem('events')) || [];

тут кавычки ненужны
либо
var events = localStorage.getItem('events') || "[]";
var myStorage = JSON.parse(events);

здесь без кавычек никак

Alexander Belov 01.05.2015 23:51

Благодарю за помощь!
Плюсы не могу ставить вам в карму временно.


Часовой пояс GMT +3, время: 08:11.