在json

时间:2017-09-13 06:30:00

标签: javascript json

我有多个这样的记录,

  

姓名: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));

1 个答案:

答案 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:
我建议总是在别名中添加全名,这样可以简化过滤部分(不需要||)。