【问题标题】:IndexedDB: Indexing object values?IndexedDB:索引对象值?
【发布时间】:2014-05-27 17:52:07
【问题描述】:

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

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

我想一次搜索所有关键字,然后在“列表”中循环查找匹配项以查找相似之处。我想知道是否最好将所有关键字单独存储在另一个表中,或者循环遍历每个列表并每次使用新的正则表达式搜索关键字,记住有数千个这样的列表。

【问题讨论】:

  • 请尝试使用更准确地描述您的问题的标题。这样你可能会得到更多帮助。

标签: javascript indexeddb


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

【讨论】:

  • 我在索引的 keyPath 中使用了 multiEntry 和一个对象属性(但一个条目需要多个 objectStore.add() ,因为每个 list 的 keyPath 不能有 [i]只有句点——只有 keyPath 中的对象引用),但我会研究 trie,因为它看起来很有趣。非常感谢您的回答!
猜你喜欢
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 2012-11-20
  • 1970-01-01
  • 2017-04-14
  • 1970-01-01
  • 2017-01-04
  • 2014-07-11
相关资源
最近更新 更多