如何在不事先知道密钥的情况下检索所有localStorage项

How to retrieve all localStorage items without knowing the keys in advance?

本文关键字:检索 情况下 localStorage 密钥 先知      更新时间:2023-09-26

我想显示之前编写的所有密钥和存储。我的代码在下面。我创建了一个函数(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));
        }
    }

ES2015+中最简单的方法是:

const items = { ...localStorage };

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

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循环更快,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;
}

最简单的方法是使用:

return JSON.stringify(localStorage);

localStorage不是一个数组,而是一个对象,所以试试这样的东西:

for (var a in localStorage) {
   console.log(a, ' = ', localStorage[a]);
}
// iterate localStorage
for (let i = 0; i < localStorage.length; i++) {
  // set iteration key name
  const key = localStorage.key(i);
  // use key name to retrieve the corresponding value
  const value = localStorage.getItem(key);
  // console.log the iteration key and value
  console.log('Key: ' + key + ', Value: ' + value);  
}
for (let [key, value] of Object.entries(localStorage)) {
    console.log(`${key}: ${value}`);
}

更简洁一点:

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

获取所有";localStorage";,复制它并将localStorage设置在您想要的位置

let localstorage= {...localStorage}
let content = 'localStorage.clear()
$.each(localstorage,(i,e)=> {
   content+=`localStorage.setItem('${i}','${e}');`}) 
copy(content)

您可以使用带有hasOwnProperty的for循环来检查对象是否有键。

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

这将返回所有设置的密钥

const getLocalStorageObject = () => {
    storage = {}
    let index = 0
    while (localStorage.key(index) !== null) {
        const key = localStorage.key(index);
        storage[key] = localStorage.getItem(key)
        index += 1
    } 
    return storage;
}

我希望它能帮助你,我添加了一个rest参数,这只允许留下所需的属性

  localStorage.setItem("clear", "values")
  const {clear, ...rest } = localStorage;

  function allStorage(val) {
    const { ...rest } = localStorage;
    return val ? Object.keys(rest) : Object.values(rest);
  }
  console.log(allStorage(false));

通过以下方式获取localStorage密钥数组:

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

尝试"正确答案"可能会很明显,但如果您想迭代或只搜索关键字名称,localStorage._keys是您的简单起点。

这些都是庞大的或完全不正确的。

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