【问题标题】:How to retrieve all localStorage items without knowing the keys in advance?如何在事先不知道密钥的情况下检索所有 localStorage 项目?
【发布时间】:2013-07-18 16:36:37
【问题描述】:

我想显示之前编写的所有密钥和存储。 我的代码如下。我创建了一个函数(allStorage),但它不起作用。 我怎样才能做到这一点?

    function storeUserScribble(id) {
        var scribble = document.getElementById('scribble').innerHTML;
        localStorage.setItem('userScribble',scribble);
    }

    function getUserScribble() {
        if ( localStorage.getItem('userScribble')) {
            var scribble = localStorage.getItem('userScribble');
        }
        else {
            var scribble = 'You can scribble directly on this sticky... and I will also remember your message the next time you visit my blog!';
        }
        document.getElementById('scribble').innerHTML = scribble;
    }

    function clearLocal() {
        localStorage.clear();
        return false;
    }

    function allStorage() {
        var archive = [];
        for (var i = 0; i<localStorage.length; i++) {
            archive[i] = localStorage.getItem(localStorage.key(i));
        }
    }

【问题讨论】:

标签: javascript local-storage


【解决方案1】:

如果您将函数修改为此,您可以根据键列出所有项目(将仅列出项目):

function allStorage() {

    var values = [],
        keys = Object.keys(localStorage),
        i = keys.length;

    while ( i-- ) {
        values.push( localStorage.getItem(keys[i]) );
    }

    return values;
}

Object.keys 是 JavaScript (ECMAScript 5) 的新增功能。它列出了对象上所有自己的键,这比使用 for-in 循环更快,这是一个选项。

但是,这不会显示密钥。为此,您需要返回一个对象而不是一个数组(这是相当无意义的 IMO,因为这将使您像以前一样使用 localStorage 只是使用不同的对象 - 但例如,为了举例):

function allStorage() {

    var archive = {}, // Notice change here
        keys = Object.keys(localStorage),
        i = keys.length;

    while ( i-- ) {
        archive[ keys[i] ] = localStorage.getItem( keys[i] );
    }

    return archive;
}

如果您想要一个紧凑的格式列表,请改为执行此操作 - 这里数组中的每个项目都将具有 key=item,您稍后可以将其拆分成对,依此类推:

function allStorage() {

    var archive = [],
        keys = Object.keys(localStorage),
        i = 0, key;

    for (; key = keys[i]; i++) {
        archive.push( key + '=' + localStorage.getItem(key));
    }

    return archive;
}

【讨论】:

  • 很好,不知道Object.keys,+1
  • 正是我需要的,我试图用数组来制作它,但它没有用,当我将它更改为对象时,它对我有用,也感谢您的描述:)
【解决方案2】:

ES2015+中最简单的方法是:

const items = { ...localStorage };

【讨论】:

  • 这是什么巫毒教? Spread syntax?
  • 这不会遇到hasOwnProperty问题吗?
  • 简洁但不回答问题。你只是得到一个新对象。
  • 有趣的是这是我见过的最冗余的代码。这和只写 localStorage 一样。 localStorage -> {...localStorage}
  • @atilkan 你错了:localStorage 将返回 Storage 对象的实例;而{...localStorage} - 一个简单的对象
【解决方案3】:

localStorage 不是数组,而是对象,所以试试看。像这样:

for (var a in localStorage) {
   console.log(a, ' = ', localStorage[a]);
}

【讨论】:

  • 这也会列出函数。
  • @Nux 它不适合我
  • 奇怪...似乎只是Firefox中的问题。
  • 我猜你需要使用 localStorage.hasOwnProperty(a) 让它不列出函数
【解决方案4】:

最简单的方法是使用:

return JSON.stringify(localStorage);

【讨论】:

    【解决方案5】:
    // iterate localStorage
    for (var i = 0; i < localStorage.length; i++) {
    
      // set iteration key name
      var key = localStorage.key(i);
    
      // use key name to retrieve the corresponding value
      var value = localStorage.getItem(key);
    
      // console.log the iteration key and value
      console.log('Key: ' + key + ', Value: ' + value);  
    
    }
    

    【讨论】:

      【解决方案6】:
      for (let [key, value] of Object.entries(localStorage)) {
          console.log(`${key}: ${value}`);
      }
      

      【讨论】:

        【解决方案7】:

        再简洁一点:

        function getAllLocalStorage() {
            return Object.keys(localStorage)
                .reduce((obj, k) => {
                    return { ...obj, [k]: localStorage.getItem(k)}}, {});
                }
        

        【讨论】:

          【解决方案8】:

          var localstorage= {...localStorage}; var content = 'localStorage.clear();'; $.each(localstorage,(i,e)=>{ content+=localStorage.setItem('${i}','${e}');}) 复制(内容)

          【讨论】:

            【解决方案9】:

            这些都是笨重的或完全不正确的。

            正确答案是:
            JSON.parse(JSON.stringify(localStorage))

            【讨论】:

              【解决方案10】:

              以这种方式获取一组 localStorage 键:

              console.log('keys: ', localStorage._keys)
              

              尝试“正确答案”可能会很明显,但如果您只想遍历或搜索键名,localStorage._keys 是您的简单起点。

              【讨论】:

              • 我没有看到这个工作。您是否在 Chrome 控制台上尝试过此操作?或者你能分享一些你找到 localStorage._keys 属性的文件吗?
              • 嘿@JCrist,欢迎来到SO!感谢您的贡献,但您的回答不起作用。 localStorage 对象没有称为 _keysnative 属性
              猜你喜欢
              • 1970-01-01
              • 2012-02-27
              • 2014-05-21
              • 2021-11-14
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多