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.keys
、Object.entries
等的解决方案无法可靠地使用所有存储密钥 - 例如,密钥 "length"
将无法正常工作,即使使用 "length'
就可以了作为带有getItem
和setItem
的键。那是因为Storage
接口已经定义了一个名为length
的属性(存储列表的长度),所以你不能使用localStorage.length
访问一个以"length'
为键的存储项,你必须localStorage.getItem("length")
。 Object.keys
和 Object.entries
将忽略这些存储条目。 (除了看起来在"key"
键周围的 Chrome 中有一个奇怪的错误。) 上面的内容可以可靠地使用 length
、key
和其他类似的键(但实际上是 length
和key
是最成问题的)。
但是,在您的特殊情况中,您知道密钥不是 length
或 key
或 Storage.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作为对象的常见缺陷,即不会检索到length
、getItem
、setItem
、key
等键.
这在 IE11 上也不起作用,但这越来越无关紧要(尽管遗憾的是还不是完全无关紧要)。使用Object.keys
会。
实际上,Object.keys
也会省略 "length"
。以上是关于Mozilla localStorage.getItem 基于唯一密钥的部分知识的主要内容,如果未能解决你的问题,请参考以下文章