Как обновить массив с тем же ключом в Session Storage

Я пытаюсь сохранить страницы посещенной истории в Session-storage. Хранилище сессий работает так, как я хочу.

Проблема: Когда я захожу на 1-ю, 2-ю, 3-ю и 4-ю страницы, а затем снова на 2-ю и 3-ю страницы, он не обновляет массив снова со 2-й и 3-й страницей.

Не добавляя данные в массив 2-й и 3-й страницы, они уже существуют, но я снова посещаю эти страницы, после чего они должны быть добавлены в массив.

Я хочу сохранить в массиве каждую страницу, посещенную в истории.

if (window.sessionStorage) {
    var currentTite = document.title;
    var currentURL = window.location.href;
    sessionStorage.setItem(currentTite, currentURL);
    //var storedData = sessionStorage.getItem(currentTite);

    for (i = 0; i <= sessionStorage.length - 1; i++) {
        key = sessionStorage.key(i);
        console.log(key);
        val = sessionStorage.getItem(key);
        console.log(val);
    }
}

3 ответа

Решение

sessionStorage Объект не является массивом. Это пример родного Storage конструктор, который сохраняет данные при навигации по страницам. И вы можете иметь только одно значение для каждого ключа. Ваша лучшая ставка будет состоять из пространства имен истории в сеансе под history ключ и сохранить массив JSON под этим ключом.

Вот пример:

window.addEventListener('load', function recordInHistory() {
  var current = sessionStorage.getItem('history');
  if (!current) { // check if an item is already registered
    current = []; // if not, we initiate an empty array
  } else {
    current = JSON.parse(current); // else parse whatever is in
  }
  current.push({
    title: document.title,
    url: window.location.href
  }); // add the item
  sessionStorage.setItem('history', JSON.stringify(current)); // replace
});

Чтобы восстановить историю, конечно JSON.parse(sessionStorage.getItem('history')) буду работать.

Первый параметр setItem является ключом, вы можете добавить случайное число или Date.now() или значение counter++, чтобы сделать его уникальным.

if (window.sessionStorage) {
    var currentTite = document.title;
    var currentURL = window.location.href;
    sessionStorage.setItem(currentTite + ':' + Date.now().toString(), currentURL);

    for (i = 0; i <= sessionStorage.length - 1; i++) {
        key = sessionStorage.key(i);
        console.log(key);
        val = sessionStorage.getItem(key);
        console.log(val);
    }
}

Это зависит от того, как вы хотите обрабатывать данные впоследствии. Во всяком случае, как sessionStorage является хранилищем ключ-значение, вы не можете хранить разные значения с одинаковыми ключами и не можете иметь дублирующиеся пары ключ-значение в хранилище.

Как вариант, вы можете хранить массив истории пользователя, представленный объектами ({ title: document.title, url: window.location.href }). Код будет выглядеть примерно так:

var UserHistory = {
   key: 'userHistory',
   push: function() {
      var cur = JSON.parse(sessionStorage.getItem(UserHistory.key)) || [];
      cur.push({ title: document.title, url: window.location.href });
      sessionStorage.setItem(UserHistory.key, JSON.stringify(cur));
   },
   get: function() {
      return JSON.parse(sessionStorage.getItem(UserHistory.key));
   }
}
UserHistory.get(); // null
UserHistory.push();
UserHistory.get(); // [ Object ]
Другие вопросы по тегам