我有多个这样的记录,
姓名:John Doe
别名:John,Doe,JD
unique_id:1
...
我的问题是如何在别名中有效搜索&全名。 如果搜索查询是其中任何一个(John Doe,John,Doe,JD),我想找到唯一的id(在这种情况下为1)。
我做了什么:我有一个非常简单的实现,它会循环遍历整个数据,直到找到它为止。由于字段数非常高,所以需要很长时间。
注意:如果有帮助我正在使用javascript。此外,我有权更改数据格式(永久),如果它将使搜索更有效。大多数搜索查询往往是别名而不是全名。
示例代码:https://jsfiddle.net/nh7yqafh/
function SearchJSON(json, query) {
var champs = json.champs;
for (var i = 0; i < champs.length; ++i) {
if (query == champs[i].name)
return champs[i].unique_id;
for (var j = 0; j < champs[i].aliases.length; ++j) {
if (query == champs[i].aliases[j])
return champs[i].unique_id;
}
}
}
//Data format is similar to what vivick said
var json_string = '{"count":5,"champs":[{"name":"Abomination","aliases":["abomination","AB","ABO"],"unique_id":1},{"name":"Black Bolt","aliases":["blackbolt","BB","BBT"],"unique_id":2},{"name":"Black Panther","aliases":["blackpanther","BP","BPR"],"unique_id":3},{"name":"Captain America","aliases":["captainamerica","CA","CAP"],"unique_id":4}]}'
var json = JSON.parse(json_string);
query="CA";
alert( "id of "+query+" is "+SearchJSON(json, query));
答案 0 :(得分:0)
我猜你的结构类似于以下结构:
[
{
"name": "xxx",
"aliases": ["x", "xx", "xxx"],
"unique_id": 1,
/* [...] */
},
/* [...] */
]
然后你可以这样做:
const queryParam = /*search query*/;
const arr = /* get the JSON record */;
const IDs = arr
.filter( entry =>(entry.aliases.includes(queryParam) || queryParam===entry.name) )
.map(entry=>entry.uniqueId);
这将为您提供一系列可能匹配的ID。 如果您只需要0或1结果:
const ID = IDs[0] || null;
如果有的话,这将只检索第一个匹配的ID,否则将ID设置为null。
NB:
如果你使用一个对象而不是一个对象数组,那么只需做一些修改(主要是使用Object.entries
),但它仍然是微不足道的。
PS:
我建议总是在别名中添加全名,这样可以简化过滤部分(不需要||
)。