19.03.2015, 07:31
|
|
Профессор
|
|
Регистрация: 12.03.2015
Сообщений: 173
|
|
Удаление / добавление 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
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,132
|
|
Сообщение от Alexander Belov
|
var events = localStorage.getItem('events');
events.splice(1,4);
|
где превращение строки в массив?
|
|
19.03.2015, 11:30
|
|
Профессор
|
|
Регистрация: 12.03.2015
Сообщений: 173
|
|
Сообщение от рони
|
где превращение строки в массив?
|
А разве переменная 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
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,132
|
|
Сообщение от Alexander Belov
|
А разве переменная events не является массивом?
|
Сообщение от Alexander Belov
|
var events = localStorage.getItem('events');
|
пока только строка
|
|
19.03.2015, 12:25
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,132
|
|
Alexander Belov,
var events = localStorage.getItem('events')||"[]";
events = JSON.parse(events);
events.splice(1,4);
|
|
19.03.2015, 23:07
|
|
Профессор
|
|
Регистрация: 12.03.2015
Сообщений: 173
|
|
Что-то splice() не работает, массив остаётся как есть без изменений.
|
|
19.03.2015, 23:12
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,132
|
|
Alexander Belov,
где код ?
|
|
19.03.2015, 23:30
|
|
Профессор
|
|
Регистрация: 12.03.2015
Сообщений: 173
|
|
рони,
Функция добавления события в календарь + удаления первого из них
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 срабатывает по нажатию на кнопку.
Последний раз редактировалось Alexander Belov, 19.03.2015 в 23:33.
|
|
20.03.2015, 00:39
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,132
|
|
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>
|
|
21.03.2015, 22:46
|
|
Профессор
|
|
Регистрация: 12.03.2015
Сообщений: 173
|
|
рони,
Благодарю за помощь! Но как переделать функцию не на два события, а на не ограниченное количество? На столько, сколько будет введено пользователем?
+ не понятна запись
events.length >= 2 && (events.length=2)
Почему левая часть без скобок, а правая в скобках? И зачем повторять "равно двум" в обеих частях (в левой "больше либо равно двум", в правой - "равно двум")?
|
|
|
|