想在js中实现快速搜索(万级数据,类似mysql中的where name=xxx),如何实现?

cztonline
  • 468

js中存放的数据格式类似:

[
  ["id":1,"name":"李明","brief":"简介111"],
  ["id":2,"name":"李红","brief":"简介222"],
  ["id":3,"name":"张三","brief":"简介333"]
]

数据量大概几万条
现在有需求要能实时快速根据name快速查找到那一条的值,类似mysql中的where name=xxx,对速度要求高,所以不能调接口,调接口就慢了,

用什么查找算法实现这个需求响应速度最快?

回复
阅读 1.5k
6 个回答
✓ 已被采纳

思路可以是一样的嘛,你维护一个name的索引..
比如一个这样的结构
let index={"李明":[0,1]}; //"name":[下标数组]
那么你的查询就变成了
index['李明'],然后按下标去找就好了

万级数据使用 data.find(item=>item.name === 'xxx') 不至于出现延迟,如果觉得太慢,可以使用 map 数据结构,但是需要你先整理出来key键,所以要么在后台返回的时候就以这样的格式:

const data = [
    ["李明", {"id":1,"name":"李明","brief":"简介111"}],
    ["李红", {"id":2,"name":"李红","brief":"简介222"}],
    ["张三", {"id":3,"name":"张三","brief":"简介333"}],
]
const mapData = new Map(data)

要不然就是使用js去整理:

const data = [
  {"id":1,"name":"李明","brief":"简介111"},
  {"id":2,"name":"李红","brief":"简介222"},
  {"id":3,"name":"张三","brief":"简介333"}
]
const mapData = new Map(data.map(item=>{
  return [item.name, item]
}))

最后使用都是

mapData.get("张三")
// 直接返回 {"id":1,"name":"李明","brief":"简介111"}

如果是全匹配, 最简单的, 遍历一次将name作为key, value为你的数据数组存放起来, 匹配就可以了. 如果不是全匹配支持模糊的话, 就只能自己写, 根据name的值生成一个树, 再根据你的查询条件去寻找

项目中用一个json文件记录上万个数据,就不用调用接口查数据库了,
这个json文件可以写个脚本自动生成,数据库有变化的时候删除再生成

chenghao94
  • 2
新手上路,请多包涵

数组的filter方法

宣传栏