Mozilla localStorage.getItem 基于唯一密钥的部分知识

Posted

技术标签:

【中文标题】Mozilla localStorage.getItem 基于唯一密钥的部分知识【英文标题】:Mozilla localStorage.getItem based on partial knowlege of an unique key 【发布时间】:2021-10-12 11:05:59 【问题描述】:

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

UUID1 : "BLABLABLA": UUID2 : Value

关键部分如下所示:

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

值只是一个长字符串。

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

localStorage.getItem 返回它的值

也许使用Object.entries(localStorage)

非常感谢您提供代码示例?

【问题讨论】:

Object.entries(localStorage) 应该可以正常工作....你试过了吗? 【参考方案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 将忽略这些存储条目。 (除了看起来在"key" 键周围的 Chrome 中有一个奇怪的错误。) 上面的内容可以可靠地使用 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"

以上是关于Mozilla localStorage.getItem 基于唯一密钥的部分知识的主要内容,如果未能解决你的问题,请参考以下文章

Mozilla研究—深入理解mozilla所需的背景知识

Mozilla新特性只支持https网站

Enter 键在 Mozilla 中不会打开下拉菜单

Mozilla新特性只支持https网站

IE 和 Chrome/Mozilla 中的 Img 大小不同

永别了 Firefox OS!Mozilla 宣布解散 Firefox OS 幕后团队