使用字典树实现一个可以自动补全的输入框

news/2024/7/9 23:51:55 标签: 前端, vue

在这里插入图片描述

说在前面

平时我们在终端输入命令的时候是不是都可以通过tab键来进行快速补全?那么有没有想过怎么去实现这个自动补全的功能呢?今天让我们一起来使用字典树实现一个可以自动补全的输入框。

效果展示

在这里插入图片描述

体验地址

http://jyeontu.xyz/jvuewheel/#/JAutoCompleteInputView

功能实现

一、字典树

字典树(Trie树)是一种多叉树结构,通常用于存储关联数组,其中键通常是字符串。字典树的每个节点都包含若干指向子节点的指针,以及表示一个字符的值。通过在树中沿着键的字符序列从根节点到叶节点的路径,字典树可以有效地支持诸如查找、插入和删除等操作。

字典树主要有以下几个特点和用途:

  1. 高效的字符串检索:字典树可以在O(m)的时间复杂度内完成对长度为m的字符串的检索操作,这比哈希表和二叉搜索树的检索效率更高。
  2. 前缀匹配:字典树可以快速查找具有相同前缀的字符串集合,例如自动补全、拼写检查等应用。
  3. 字典、单词和文本处理:字典树可以用于构建字典、实现单词频率统计、前缀匹配和模式匹配等文本处理任务。
  4. 路由协议查找:在计算机网络领域,字典树可以用于路由表的快速查找,以确定数据包的下一跳路径。

总之,字典树以其高效的字符串检索和前缀匹配能力,在搜索引擎、拼写检查、路由协议查找等领域有着广泛的应用。希望这些信息能够帮助你理解字典树的概念和用途

1、实现

字典树的实现我前面有写过一篇相关的博客进行了详细的介绍,有兴趣的可以看下:《JavaScript实现前缀树》,这里就不重复介绍了。

2、字典树库

之前我自己也封装了一个数据结构相关库,目前已实现:堆、优先队列、字典树、LFU缓存、链表,这里可以直接引入该库的字典树来使用。

(1)安装
npm install @jyeontu/structure-jyeontu
(2)使用
vue">import { TrieTree } from "@jyeontu/structure-jyeontu";
this.trieTree = new TrieTree(this.wordList);

1699980595719.jpg

(3)源码

源码地址:https://gitee.com/zheng_yongtao/structure-jyeontu/tree/master/src/TrieTree

二、自动补全功能

我们希望的效果是:初始化一个字典数组,后面输入框输入字符时,会检测出字典中以当前输入字符为前缀的所有字符作为备选列表展示在输入框下方,按tab键会选择备选列表中最接近当前字符的字符进行自动补全。

比如我们现在有这样一个字典数组:[ "app", "apple", "blue", "banana", "苹果", "香蕉", "JYeontu", "jyeontu", "自动补全", "hello", "hello world", "你好世界", "你好" ],输入框输入的时候,备选列表会显示你好、你好世界,按下tab键后会将你好直接补全到输入框中,也可以直接点击备选列表的文字选择补全,比如点击你好世界后会将你好世界直接补全到输入框中。

image.png

1、初始化字典数

首先我们应该要先将传入的字典数组转为字典树。

import { TrieTree } from "@jyeontu/structure-jyeontu";
this.trieTree = new TrieTree(
    this.wordList.sort((a, b) => a.length - b.length)
);
2、输入框
<input
    class="j-auto-complete-input"
    @keydown.tab.prevent="handleTabKey"
    @input="handleInput"
    v-model="inputVal"
/>
(1)输入字符动态更新备选列表

我们只需监听input框的input事件,在触发的时候更新备选列表即可。

handleInput() {
    this.selectList = this.trieTree.getWordsByPrefix(this.inputVal);
    this.$emit("input", this.inputVal);
},
(2)按下tab键自动补全

使用@keydown.tab指令来监听Tab键的按下事件,并调用handleTabKey方法进行相应的操作,我们不希望按下tab键后失去聚焦,所有要阻止默认行为,即使用@keydown.tab.prevent

handleTabKey() {
    if (this.selectList.length) this.inputVal = this.selectList[0];
    this.handleInput();
},
3、备选列表

我们希望点击备选列表时也可以进行快速补全,监听一下列表的点击事件即可。

vue"><div class="j-auto-complete-panel" v-if="showChooseList">
    <div
        class="j-auto-complete-panel-item"
        v-for="(text, textInd) in selectList"
        :key="'JAutoCompleteInputItem' + textInd"
        @click="selectText(text)"
    >
        {{ text }}
    </div>
</div>
selectText(text) {
    this.inputVal = text;
    this.handleInput();
}

源码

该组件库源码已开源,有兴趣的可以到gitee仓库查看,欢迎watch、star、fork,有什么其他想要实现的组件也可以提个issue或者在公众号给我留言。

一、gitee

gitee 地址:https://gitee.com/zheng_yongtao/jyeontu-component-warehouse.git

二、公众号

关注公众号『前端也能这么有趣』发送 组件库即可获取源码。

三、组件体验及文档地址

目前该组件库已经发布到npm上,可以直接通过npm install,具体使用方法可以查看以下文档:

jvuewheel:http://jyeontu.xyz/jvuewheel/#/installView

说在后面

🎉 这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,偶尔也会在自己的公众号『前端也能这么有趣』发一些比较有趣的文章,有兴趣的也可以关注下。在此谢谢大家的支持,我们下文再见 🙌。


http://www.niftyadmin.cn/n/5181049.html

相关文章

在线预览编辑PDF::RAD PDF for ASP.NET

RAD PDF for ASP.NET作为功​​能最齐全的基于 HTML 的 PDF 查看器、编辑器和 ASP.NET 表单填充器&#xff0c;RAD PDF 为传统 PDF 解决方案提供了灵活而强大的替代方案。与 Adob​​e Acrobat Reader 不同&#xff0c;RAD PDF 几乎可以在任何现代网络浏览器中运行&#xff0c;…

Jenkins中强制停止停不下来的job

# Script console 执行脚本 Jenkins 的提供了 script console 的功能&#xff0c;允许你写一些脚本&#xff0c;来调度 Jenkins 执行一些任务。 我们就可以利用 script console 来强制停止 job 执行。 首先进入 Jenkins 的 script console 页面&#xff1a; script console 路…

【Android】画面卡顿优化列表流畅度五之下拉刷新上拉加载更多组件RefreshLayout修改

之前也写过类似组件的介绍&#xff1a; 地址&#xff1a;下拉刷新&上拉加载更多组件SmartRefreshLayout 本来打算用这个替换的&#xff0c;但在进行仔细研究发现不太合适。功能都很好&#xff0c;但嵌入不了当前的工程体系里。原因就是那啥体制懂的都懂。这样的组件需要改…

修炼k8s+flink+hdfs+dlink(七:flinkcdc)

一 &#xff1a;flinkcdc官网链接。 https://ververica.github.io/flink-cdc-connectors/release-2.1/content/about.html 二&#xff1a;在flink中添加jar包。 在flink lib目录下增加你所需要的包。 https://kdocs.cn/join/gv467qi?f101 邀请你加入共享群「工作使用重要工具…

JavaWeb——HTML常用标签

目录 1. 标题标签 2. 段落标签 3. 换行/分割线标签 4. 列表标签 4.1. 有序列表 4.2. 无序列表 5. 超链接标签 6. 多媒体标签 6.1. img 图片标签 6.2. audio 音频标签 6.3. video 视频标签 7. 表格标签(重点) 8. 表单标签&#xff08;重点&#xff09; 1. 标题标签 …

Ubuntu22.04源码安装ROS-noetic(ROS1非ROS2),编译运行VINS-MONO

1. Ubuntu22.04源码编译安装ROS-noetic 由于22.04默认安装ROS2&#xff0c;但很多仓库都是基于ROS1的&#xff0c;不想重装系统&#xff0c;参考这两个博客安装了ROS-noetic&#xff1a; 博客1. https://blog.csdn.net/Drknown/article/details/128701624博客2. https://zhua…

Spring 6 资源Resources 相关操作

Java全能学习面试指南&#xff1a;https://javaxiaobear.cn 1、Spring Resources概述 Java的标准java.net.URL类和各种URL前缀的标准处理程序无法满足所有对low-level资源的访问&#xff0c;比如&#xff1a;没有标准化的 URL 实现可用于访问需要从类路径或相对于 ServletCont…

RT-DETR算法优化改进:Backbone改进 | Next-vit,用于现实工业场景的下一代视觉 Transformer

💡💡💡本文独家改进:Next-ViT助力RT-DETR ,替换backbone,具有部署友好机制的强大卷积块和变换块,即NCB和NTB。Next-ViT堆栈NCB和NTB 构建先进的CNN-Transformer混合架构。 推荐指数:五星 RT-DETR魔术师专栏介绍: https://blog.csdn.net/m0_63774211/category_12…