如何在会话存储中使用相同的键更新数组

Posted

技术标签:

【中文标题】如何在会话存储中使用相同的键更新数组【英文标题】:How to update array with same key in Session Storage 【发布时间】:2015-07-21 05:04:26 【问题描述】:

我正在尝试将访问历史记录的页面存储在 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);
    

【问题讨论】:

【参考方案1】:

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')) 当然可以。

【讨论】:

如何在控制台中获取所有详细信息? @PuzzledBoy 只需使用console.log(sessionStorage.getItem('history')); @PuzzledBoy 将'history' 替换为您问题中的currentTite 变量没有任何问题。如果您的 javascript 代码是从外部文件加载并在多个页面中使用的,我会这样做。【参考方案2】:

这取决于您以后要如何处理数据。无论如何,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 ]

【讨论】:

如何在控制台中获取所有详细信息? @PuzzledBoy 有一个 get 方法可以返回整个数据数组。然后你迭代它。【参考方案3】:

setItem的第一个参数是key,可以附加一个随机数或者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 键中包含Date.now() 不是一个好主意。每次用户重新加载页面时,您都在创建另一组数据。您如何确定要加载哪个集,要删除哪个集? @Mottie 你是对的,但这不是问题的目标吗?也许增量数字更合适。 啊,是的,我想你是对的。我不知道为什么没有使用window.history。

以上是关于如何在会话存储中使用相同的键更新数组的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 不会删除/更新会话

如何在不退出的情况下更新会话值?

由于两次会话同时访问相同的存储过程,因此发生了事务(进程ID)死锁

如何将数组存储到php中的会话变量中

本地存储如何在域级别上工作?两个站点使用相同的密钥来存储数据? [复制]

Nodejs + Passport.js + Redis:如何在 Redis 中存储会话