在javascript中优化JSON查询性能

sus*_*sdu 6 javascript xml json query-performance

我有一个10MB的以下结构的JSON文件(10k条目):

{
entry_1: {
    description: "...",
    offset: "...",
    value: "...",
    fields: {
        field_1: {
            offset: "...",
            description: "...",
        },
        field_2: {
            offset: "...",
            description: "...",
        }   
    }
},
entry_2:
...
...
...
Run Code Online (Sandbox Code Playgroud)

}

我想实现一个自动完成输入字段,该字段将在搜索多个属性时尽快从此文件中获取建议.例如,查找包含某些子字符串的所有条目名称,字段名称和描述.

方法1:

我试图将嵌套展平成一个字符串数组:

"entry_1|descrption|offset|value|field1|offset|description",
"entry_1|descrption|offset|value|field2|offset|description",
"entry2|..."
Run Code Online (Sandbox Code Playgroud)

并执行不区分大小写的部分字符串匹配,查询耗时约900ms.

方法2

我尝试了基于Xpath的JSON查询(使用defiant.js).

  var snapshot = Defiant.getSnapshot(DATA);
  found = JSON.search(snapshot, '//*[contains(fields, "substring")]');
Run Code Online (Sandbox Code Playgroud)

查询耗时约600毫秒(仅适用于单个属性fields).

是否有其他选项可以让我达到100毫秒?我控制文件格式,所以我可以把它变成XML或任何其他格式,唯一的要求是速度.

HMR*_*HMR 2

由于您正在尝试搜索值的子字符串,因此按照建议使用 indexeddb 并不是一个好主意。您可以尝试将字段的值展平为文本,其中字段由 分隔::,对象中的每个键都是文本文件中的一行:

{
  key1:{
    one:"one",
    two:"two",
    three:"three"
  },
  key2:{
    one:"one 2",
    two:"two 2",
    three:"three 2"
  }
}
Run Code Online (Sandbox Code Playgroud)

将:

key1::one::two::three
key2::one 2::two 2::three
Run Code Online (Sandbox Code Playgroud)

然后使用正则表达式搜索该keyN::部分之后的文本并存储所有匹配的键。然后将所有这些键映射到对象。因此,如果key1是唯一的匹配项,您将返回 [data.key1]

下面是一个包含 10000 个键的示例数据的示例(在笔记本电脑上搜索需要几毫秒,但在限制到移动设备时尚未进行测试):

{
  key1:{
    one:"one",
    two:"two",
    three:"three"
  },
  key2:{
    one:"one 2",
    two:"two 2",
    three:"three 2"
  }
}
Run Code Online (Sandbox Code Playgroud)