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或任何其他格式,唯一的要求是速度.
由于您正在尝试搜索值的子字符串,因此按照建议使用 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)