如何在巨大的 json 文件之间执行最佳模式搜索?
Posted
技术标签:
【中文标题】如何在巨大的 json 文件之间执行最佳模式搜索?【英文标题】:How to perform optimal pattern search between huge json files? 【发布时间】:2021-01-11 19:19:01 【问题描述】:寻找在 JSON 文件之间执行模式搜索的解决方案,该解决方案可以遍历巨大的 JSON 文件而不会对性能产生太大影响。以下是几个测试用例。
搜索条件
-
“cabin_1”与“cabin_1”匹配
“cabin_3”与“cabin 3”或“3cabin”匹配
“第一舱”与“第一舱”匹配
测试用例文件
你可以找到测试json文件here
我的想法
for each json1Property in json1
for each json2Property in json2
isMatch = regex('somepattern', json1property , json2property)
if (isMatch)
return true
else
return false
【问题讨论】:
您没有添加 JSON 文件,现在很难想出没有它的解决方案。另外,我认为你对你的期望不是很准确。你只想得到一个布尔值是否符合你的匹配规则? @sjahan json 文件在测试用例文件头中。为了简单起见,只需匹配并返回 true 或 false 就足够了。我正在寻找更好的算法,而不仅仅是循环和比较每个属性 所以你想比较每个space
,看看它们是否包含匹配项,对吧?我不确定我是否完全理解您的搜索条件:列表是否详尽且明确?第五条规则的意义何在? “cabin_2”必须与“cabin2”匹配,但“cabin_1”是与“cabin1”匹配还是仅与“cabin_1”匹配?
是的,cabine_1 应该匹配cabin1
【参考方案1】:
这是相当基本的,我不是算法专家,但基本上,目标是为每个数组构建一个简单的索引。您简化并将值映射到更容易/更快的东西以便以后比较。我认为一种或另一种方式,你必须迭代数组。
在这里,您在每个数组上迭代一次以构建索引,而在您的第一次尝试中,您有一个双循环。
双循环在第二阶段有点存在,将索引与filter
/includes
进行比较,但我认为它会更轻,因为数组的长度减少了,数据更容易检查。
const data =
"Building":
"floor": [
"space": [
"cabin_1",
"cabin_2",
"cabin_3",
"mycabin"
]
,
"space": [
"first cabin",
"xyz's cabin",
"Zone c",
"Zone d"
]
]
;
const spaces = data.Building.floor;
const indices = spaces.reduce((acc, item) =>
acc.push(item.space.map(it =>
return it.replace(/ ?cabin[_ ]?/g, '') //Remove cabin, trailing spaces and underscores.
.replace(/1st|first/g, '1') //Map things that are not numbers to numbers.
.replace(/2nd|second/g, '2')
.replace(/3rd|third/g, '3');
).filter(it => !isNaN(it))); //Removes every thing that is not processed by the index engine.
return acc;
, []);
console.log(indices);
let shorterArray, longerArray;
if(indices[0].length > indices[1].length)
shorterArray = indices[1];
longerArray = indices[0];
else
shorterArray = indices[0];
longerArray = indices[1];
const sharedItems = shorterArray.filter(it => longerArray.includes(it));
console.log('Shared items found', !!sharedItems.length, sharedItems);
【讨论】:
以上是关于如何在巨大的 json 文件之间执行最佳模式搜索?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用Javascript或JQuery搜索巨大的JSON