Javascript 如何在不事先知道密钥的情况下检索所有本地存储项?

Javascript 如何在不事先知道密钥的情况下检索所有本地存储项?,javascript,local-storage,Javascript,Local Storage,我想显示之前编写的所有密钥和存储。 我的代码如下。我创建了一个函数(allStorage),但它不起作用。 我该怎么做 function storeUserScribble(id) { var scribble = document.getElementById('scribble').innerHTML; localStorage.setItem('userScribble',scribble); } function getUserS

我想显示之前编写的所有密钥和存储。 我的代码如下。我创建了一个函数(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));
        }
    }
函数storeUserScribble(id){
var scribble=document.getElementById('scribble').innerHTML;
setItem('userScribble',scribble);
}
函数getUserScribble(){
if(localStorage.getItem('userScribble')){
var scribble=localStorage.getItem('userScribble');
}
否则{
var scribble='您可以直接在这个粘性页面上涂鸦……下次您访问我的博客时,我也会记住您的留言!';
}
document.getElementById('scribble')。innerHTML=scribble;
}
函数clearLocal(){
localStorage.clear();
返回false;
}
函数allStorage(){
var归档=[];

因为(var i=0;i
localStorage
不是一个数组,而是一个对象,所以请尝试以下操作:

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

如果您将功能修改为此,则可以基于键列出所有项目(将仅列出项目):

是对JavaScript(ECMAScript 5)的新添加。它列出了对象上所有自己的键,这比使用for in循环更快,for in循环是此操作的选项

但是,这不会显示键。为此,您需要返回一个对象,而不是数组(在我看来,这是一个无点的过程,因为这将使您与以前使用localStorage时一样,只使用另一个对象,但出于示例考虑):

如果您想要一个紧凑格式的列表,请改为这样做-在这里,数组中的每个项都将具有
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;
}
//迭代本地存储
for(var i=0;i
更简洁一点:

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

最简单的方法是使用:

return JSON.stringify(localStorage);

ES2015+中最简单的方法是:

const items = { ...localStorage };

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

正确答案是:

JSON.parse(JSON.stringify(localStorage))
通过以下方式获取本地存储密钥数组:

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

通过尝试“正确答案”可能会很明显,但如果您想迭代或只搜索键名,
localStorage.\u keys
是您的简单起点。

Nice,不知道
对象。keys
,+1正是我需要的,我试图使用array创建它,但当我将其更改为对象与我一起工作,也感谢您的描述:)
length
在您的代码中拼写为
lenght
。仅供参考。另请参见:这也将列出函数。@Nux它不适用于meStrange…似乎只是Firefox中的一个问题。我想您需要使用localStorage.hasOwnProperty(a)为了不列出函数这是什么巫毒?这不是遇到了hasOwnProperty问题吗?@Kzqai它只返回可枚举的属性,因此不需要额外的hasOwnProperty检查。整洁但不回答问题。你只得到一个新对象。有趣的是,这是我见过的最冗余的代码。这与编写局部变量一样torage.localStorage->{…localStorage}我看这个不起作用。你在Chrome控制台上试过这个吗?或者你可以在找到localStorage的地方共享一些文档。\u keys属性?嘿@JCrist,欢迎使用!感谢你的贡献,但你的答案不起作用。localStorage对象没有名为_keys的本机属性。
return JSON.stringify(localStorage);
const items = { ...localStorage };
for (let [key, value] of Object.entries(localStorage)) {
    console.log(`${key}: ${value}`);
}
console.log('keys: ', localStorage._keys)