【问题标题】:Mozilla localStorage.getItem based on partial knowlege of an unique keyMozilla localStorage.getItem 基于唯一键的部分知识
【发布时间】:2023-02-06 08:59:14
【问题描述】:

我正在寻找基于唯一密钥的部分知识从 Mozilla localStorage 获取项目的快速方法。我将以下结构定义为键:值

UUID1 : "BLABLABLA": UUID2 : Value

例如,关键部分看起来像这样:

ca4417f4-f83b-11eb-bf45-ffc420139ccb:BLABLABLA:e1d26c40-f83b-11eb-81c0-fbcc16bf6bdb

值只是一个长字符串。

仅基于两个 UUID(即 UUID1 或 UUID2)之一从 localStorage 中查找单个密钥的最快方法是什么,然后获取完整的密钥字符串,然后使用

本地存储.getItem返回它的价值

也许使用Object.entries(localStorage)

一个代码示例真的很感激吗?

【问题讨论】:

  • Object.entries(localStorage) 应该可以正常工作....你试过了吗?

标签: javascript local-storage mozilla


【解决方案1】:

Storage interface 有一个 length 属性告诉你有多少项目,还有一个 key method 给你项目索引的键n.因此,您可以循环查找带有 for 循环的密钥:

let key;
for (let n = 0, len = localStorage.length; n < len; ++n) {
    const thisKey = localStorage.key(n);
    if (thisKey.includes("BLABLABLA")) {
        // found it
        key = thisKey;
        break;
    }
}
if (key) {
    const value localStorage.getItem(key);
    // ...
}

请注意,使用 Object.keysObject.entries 等的解决方案不会对所有存储密钥都可靠地工作——例如,密钥 "length" 将无法正常工作,即使使用 "length' 作为密钥也没问题与getItemsetItem。那是因为Storage接口已经定义了一个名为length的属性(存储列表的长度),所以你不能使用localStorage.length访问由"length'键入的存储项,你必须localStorage.getItem("length")Object.keysObject.entries 将省略那些存储条目。(除此之外,Chrome 中 "key" 键周围似乎存在一个奇怪的错误。)以上与 lengthkey 和其他类似键一起可靠地工作(但实际上它是 lengthkey 是最有问题的)。

你的具体情况但是,您知道密钥不是 lengthkeyStorage.prototype 上的任何其他内容,因此您可以通过 Object.keys 创建一个密钥数组并使用 find 查找密钥:

// Read the disclaimers above
const key = Object.keys(localStorage).find(key => key.includes("BLABLABLA"));
if (key) {
    const value localStorage.getItem(key);
    // ...
}

...或使用Object.entries创建一个数组数组作为charlietfl shows。请注意警告。

【讨论】:

  • T.J.你能举个例子吗?
  • 在这种情况下,我知道我在整个地图上循环一次,然后我使用找到的键和方法 localStorage.getItem 来获取它的值。谢谢。
  • @RoboRobok - 因为它工作可靠,而依赖于存储对象属性的存储键的选项则不然。如果你知道一个可靠的或者,建设性的做法是发布答案。
  • “真的是最有问题的长度”,key 也很常见。
  • key 也不应该来自 Object.keys,确实很奇怪。似乎只有 Chrome。
【解决方案2】:

扩展您的 Object.entries() 概念,您可以执行以下操作:

// set a demo key/value
localStorage.setItem('foobar', 100);

const [wantedKey, wantedValue] = Object.entries(localStorage).find(([k,v])=> k.startsWith('foo'))



console.log([wantedKey, wantedValue])

Working jsfiddle

【讨论】:

  • 应该注意直接将 localStorage 用作对象的常见陷阱,即不会检索 lengthgetItemsetItemkey 等键。
  • 这在 IE11 上也不起作用,但它越来越不相关(尽管遗憾的是还不是完全不相关)。使用Object.keys 会。
  • 实际上,Object.keys 也会遗漏 "length"
猜你喜欢
  • 2021-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-30
  • 2015-02-13
  • 1970-01-01
  • 2014-08-31
  • 1970-01-01
相关资源
最近更新 更多