IndexedDB:索引对象值

IndexedDB: Indexing object values?

本文关键字:对象 索引 IndexedDB      更新时间:2023-09-26

我有一些关键字嵌套在不同深度的对象,我想将它们存储在索引中。关键字的格式如下:

{
    "list": [
        {
            "keywords": ["hi", "bye"],
            "rules": "contains 1 of the following"
        },
        {
            "keywords": ["foo", "bar"],
            "rules": "contains all of the following"
        }
    ]
}

我想一次搜索所有关键字,然后循环通过匹配的"列表"找到相似之处。我想知道是否最好将所有关键字分别存储在另一个表中或循环遍历每个列表并每次使用新的正则表达式搜索关键字,请记住有数千个这些列表。

  • indexedDB只支持整数值比较:(string1 == string2, string1>= string2, string1 <= string2)。你不能使用正则表达式搜索字符串,除非你计划将所有的单词列表以数组的形式加载到内存中并循环遍历列表。
  • 您可以将值存储在数组中,作为您正在存储的每个对象的属性,然后在该属性上创建多条目索引。使用多条目标志的效果是获取数组并在索引中为数组的每个值创建一行。例如,如果您有对象{prop1:value1,prop2:[value2,value3]},并且您在prop2上创建了一个索引,并且您对createIndex API方法使用了多条目标志,那么索引中将出现两行,一行用于value2,另一行用于value3。然后,您可以在该索引上打开游标并遍历其行,首先看到value2,然后看到value3(取决于顺序)。这将是您构建并加载到内存中的数组的源,然后分别在内存中使用您自己的正则表达式测试条件进行循环。
  • 或者,您可以将单词作为单独的对象存储在单个存储中。每个物体看起来都像{prop:word}。然后,您可以在此存储上打开游标并遍历所有单词以在内存中构建相同的数组,然后使用正则表达式进行迭代和测试。
  • 遍历内存中的值并执行测试正则表达式将会很慢。真的很慢。当你有更多的关键字时,它会变慢。但是你应该先试着使用它,因为它可能足够快,可以满足你的需求。
  • 如果你真的想加快速度,你必须学习几个高级概念。例如,如果您愿意对能够应用于表的查询类型(正则表达式)施加约束,则可以考虑使用像trie这样的高级数据结构(或者查看jQuery的创建者John Resig撰写的文章)。使用tree与"如何"使用indexedDB无关。它是你自己在indexedDB上创建的东西。但如果你这样做了,你可能会查询trie数据结构非常快。