JS实现拼音(字母)匹配(搜索)汉字(姓名)

news2024/9/23 7:23:52

这就是个模糊查询,我们平常做的都是直接输入汉字去把对应的值过滤出来,但我还真是第一次通过拼音去查询(当然不只是拼音,汉字也是可以的),以前还真没注意这个。唉,这可咋搞,我怎么知道某个汉字(字符串)的拼音的首字母是什么呢?正当我愁眉苦脸的时候,哎,一个库被我发现了,hhhhh~。就是pinyin-match。下面介绍该包的使用,这个包也不大,四百多kb。蛮高效的。下面介绍一下该库的使用

npm官方:https://www.npmjs.com/package/pinyin-match 

1. 首先说下功能:

它能够使用拼音快速检索目标。当然也可以使用汉字 

  • 简体版27KB (gzip ≈ 19KB),繁体版86KB (gzip ≈ 60KB)
  • 支持多音字、繁体字、拼音首字母匹配,具备分词功能
  • 返回位置信息,可用于高亮匹配字符
  • 在长多音字串下依然有高性能

在线演示:http://laosep.top/pinyin-match/ 

2. 安装: 

npm install pinyin-match --save

3. 引入: 

简体版: 

import PinyinMatch from 'pinyin-match';  // es  

const PinyinMatch = require('pinyin-match'); // commonjs

繁体版: 

import PinyinMatch from 'pinyin-match/es/traditional.js'; // es  

const PinyinMatch = require('pinyin-match/lib/traditional.js'); // commonjs

当然也可以script引入 

// 简体:
<script src="pinyin-match/dist/main.js"></script>
// 繁体:
<script src="pinyin-match/dist/traditional.js"></script>

4. API: 

.match(input, keyword)  //查询匹配拼音的数据。

只向外提供暴露了这么一个方法,这一个方法足够我们使用了,也很方便 

参数:

  1. input {string} 目标字符串
  2. keyword {string} 输入的拼音或其他关键词

返回:

 Array | Boolen

5. 简单使用测试示例: 

let test = '123曾经沧海难为水除却巫山不是云'

PinyinMatch.match(test, '23曾'); // [1, 3]

PinyinMatch.match(test, 'cjc') // [3, 5]

PinyinMatch.match(test, 'cengjingcanghai') // [3, 6]

PinyinMatch.match(test, 'cengjingcangha') // [3, 6]

PinyinMatch.match(test, 'engjingcanghai') // false

PinyinMatch.match(test, 'zengjingcang') // [3, 5]

PinyinMatch.match(test, 'sdjkelwqf') // false

PinyinMatch.match(test, 'zengji ng cang') // [3, 5]

PinyinMatch.match(test, 'zengji ng cangsdjfkl') // false

PinyinMatch.match('   我 爱你 中   国   ', 'nzg') // [6, 12]

PinyinMatch.match('   我 爱你 中   国   ', '爱你中') // [5, 8]

PinyinMatch.match('發', 'fa') // [0, 0]

6.  具体案例:

就是平常的列表展示加模糊搜索。所用的人员列表测试数据都是下面这种格式,章末会把完整测试数据附上。 

// 模拟后端返回的数据
export default [
  {
    name: '管理员',
    no: 'FT00000'
  },
  //...
]

其实很简单的了,主要是实现拼音的搜索过滤的功能,所以我案例里面样式也没调,主要是功能 

闲话不说了,直接上完整代码,大家看下里面的逻辑都明白了,就这么一个组件: 

<template>
  <div class="main">
    <input type="text" v-model="serchValue" placeholder="输入搜索">
    <div class="user" v-for="(user, index) in users" :key="user.no">{{ index }}# : {{ user.name }}</div>
  </div>
</template>
<script>
import userList from './data/user'
import PinyinMatch from 'pinyin-match'
let timer = null
export default {
  data() {
    return {
      serchValue: '',
      userListAll: [], // 所有数据
      users: [] // 展示的数据
    }
  },
  watch: {
    serchValue() {
      this.debounce(this.selectUser, 200)
    }
  },
  mounted(){
    this.getUserList()
  },
  methods:{
    // 模拟请求
    getUserList() {
      setTimeout(() => {
        this.userListAll = userList
        this.selectUser()
      }, 100)
    },

    // 防抖
    debounce(fn, wait) {
      if(timer) clearTimeout(timer)
      timer = setTimeout(() => {
        fn.call(this)
        timer = null
      }, wait)
    },
    
    // 模糊查询条件
    selectUser() {
      this.users = []
      // 如果搜索框有值的话再去过滤,因为PinyinMatch.match第二个参数是空字符串的话会匹配不到,返回false,这不符合我们的预期
      // 搜索框没有值,我们要展示所有数据
      if(this.serchValue) {
        this.userListAll.forEach(user => {
          let matchIndexs = PinyinMatch.match(user.name, this.serchValue) // 如果匹配到返回 首尾的索引数组,如果匹配不到则返回false
          if(matchIndexs) {
            this.users.push(user)
          }
        })
      } else {
        this.users = this.userListAll
      }
    }
  }
}
</script>
<style scoped>
.main {
  width: 100vw;
  height: 100vh;
  padding: 200px 0 0 200px;
  box-sizing: border-box;
}
.main input {
  margin-bottom: 5px;
}
</style>

接下来看下效果: 

 

接下来!我们可以把上面的示例再提高点儿难度,因为让我想起了通讯录,所以在展示的时候我们就像通讯录那样展示

首先将拿到的人员列表进行分组,根据什么分呢?就是根据字母,a、b、c...这样,难道我们要把26个英文字母全都列出来吗?当然这个也分需求,但如果是通讯录的话,我们只需要百家姓中所有的拼音的首字母就可以了,也就是:abcdefghjklmnopqrstwxyz 这些。 

在上面示例的基础上进行修改,在拿到人员数据之后,先处理一下,然后再进行过滤模糊查询

完整代码: 

<template>
  <div class="main">
    <input type="text" v-model="serchValue" placeholder="输入搜索">
    <div class="users" v-for="user in users" :key="user.key">
      <div>{{ user.key }}</div>
      <div class="user-name" v-for="o in user.data" :key="o.no">{{ o.name }}</div>
    </div>
  </div>
</template>
<script>
import userList from './data/user'
import PinyinMatch from 'pinyin-match'
let timer = null
export default {
  data() {
    return {
      serchValue: '',
      userListAll: [], // 所有数据
      users: [] // 展示的数据
    }
  },
  watch: {
    serchValue() {
      this.debounce(this.selectUser, 200)
    }
  },
  mounted(){
    this.getUserList()
  },
  methods:{
    // 模拟请求
    getUserList() {
      setTimeout(() => {
        this.userListAll = this.handlerData(userList)
        this.selectUser()
      }, 100)
    },
    // 处理数据
    handlerData(userList) {
      // 这是百家姓中所有的拼音的首字母
      const surnameLetters = 'abcdefghjklmnopqrstwxyz'.split('')
      const userListAll = []
      surnameLetters.forEach(letter => {
        let o = { key: letter, data: [] }
        userList.forEach(user => {
          let matchIndexs = PinyinMatch.match(user.name.slice(0, 1), letter) // 匹配姓氏的拼音的首字母
          if(matchIndexs) {
            o.data.push(user)
          }
        })
        if(o.data.length) {
          userListAll.push(o)
        }
      })
      return userListAll
    },

    // 防抖
    debounce(fn, wait) {
      if(timer) clearTimeout(timer)
      timer = setTimeout(() => {
        fn.call(this)
        timer = null
      }, wait)
    },

    // 模糊查询条件
    selectUser() {
      this.users = []
      if(this.serchValue) {
        this.userListAll.forEach(user => {
          let o = { key: user.key, data: [] }
          user.data.forEach(item => {
            let matchIndexs = PinyinMatch.match(item.name, this.serchValue)
            if(matchIndexs) {
              o.data.push(item)
            }
          })
          if(o.data.length) {
            this.users.push(o)
          }
        })
      } else {
        this.users = this.userListAll
      }
    }
  }
}
</script>
<style scoped>
.main {
  width: 100%;
  height: 100%;
  padding: 0 0 0 200px;
  box-sizing: border-box;
}
.main input {
  margin-bottom: 5px;
}
.user-name {
  padding-left: 10px;
}
</style>

最后看下修改后的效果: 

接下来是上面测试用的数据 

export default [
    {
        "name": "管理员",
        "no": "FT00000"
    },
    {
        "name": "朱大锤",
        "no": "FT00001"
    },
    {
        "name": "郝大锤",
        "no": "FT00002"
    },
    {
        "name": "宋大锤",
        "no": "FT00003"
    },
    {
        "name": "杨大锤",
        "no": "FT00004"
    },
    {
        "name": "石大锤",
        "no": "FT00005"
    },
    {
        "name": "郑大锤",
        "no": "FT00006"
    },
    {
        "name": "刘大锤",
        "no": "FT00007"
    },
    {
        "name": "赵大锤",
        "no": "FT00008"
    },
    {
        "name": "李大锤",
        "no": "FT00009"
    },
    {
        "name": "牛二",
        "no": "FT00010"
    },
    {
        "name": "张大锤",
        "no": "FT00011"
    },
    {
        "name": "王大锤",
        "no": "FT00012"
    },
    {
        "name": "冯大锤",
        "no": "FT00013"
    },
    {
        "name": "李大锤",
        "no": "FT00014"
    },
    {
        "name": "邓大锤",
        "no": "FT00015"
    },
    {
        "name": "孙大锤",
        "no": "FT00016"
    },
    {
        "name": "袁大锤",
        "no": "FT00017"
    },
    {
        "name": "康大锤",
        "no": "FT00018"
    },
    {
        "name": "武大锤",
        "no": "FT00019"
    },
    {
        "name": "蔡大锤",
        "no": "FT00020"
    },
    {
        "name": "戴大锤",
        "no": "FT00021"
    },
    {
        "name": "鄂大锤",
        "no": "FT00022"
    },
    {
        "name": "封大锤",
        "no": "FT00023"
    },
    {
        "name": "盖大锤",
        "no": "FT00024"
    },
    {
        "name": "景大锤",
        "no": "FT00025"
    },
    {
        "name": "麻大锤",
        "no": "FT00026"
    },
    {
        "name": "那大锤",
        "no": "FT00027"
    }
]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/464960.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python:面向对象编程(知识点+代码)

文章目录 一、类和对象1、对象属性的默认值设置2、对象属性的添加、修改与删除3 、类属性 二、类的继承 引言&#xff1a;面向对象编程时一门编程语言重要的功能&#xff0c;我们之前所学的 c&#xff0c;java都为面向对象编程语言&#xff0c;这里给大家拓展一下&#xff0c;…

getaddrinfo调用crash 的debug过程

前两天&#xff0c;产线报一例crash问题。拿到core文件后&#xff0c;栈展开信息&#xff1a; (gdb) bt #0 0x00007f64a3651aff in raise () from /lib64/libc.so.6 #1 0x00007f64a3624ea5 in abort () from /lib64/libc.so.6 #2 0x00007f64a3694097 in __libc_message () …

【论文阅读-ICSE2023】预训练目标对代码相关任务的影响

目录 简介有哪些预训练预训练的影响回答RQ1回答RQ2 总结 简介 Title: Automating Code-Related Tasks Through Transformers: The Impact of Pre-training1 Author: Rosalia Tufano, Luca Pascarella, Gabriele Bavota Published: ICSE2023 Abstract: 尽管现在很多研究能够证…

OSS的STS模式授权案例

OSS的STS模式授权 某云提供的权限管理系统主要包含两部分&#xff0c;RAM&#xff08;资源访问管理&#xff09;和STS&#xff08;安全认证服务&#xff09;&#xff0c;以满足不暴露主账号AK\SK的情况下安全的授权别人访问的需求&#xff0c;STS提供的是一种临时访问授权。通…

XSS知识总结

XSS基础 跨站脚本&#xff08;英语&#xff1a;Cross-site scripting&#xff0c;通常简称为&#xff1a;XSS&#xff09;是一种网站应用程序的安全漏洞攻击&#xff0c;是代码注入的一种。它允许恶意用户将代码注入到网页上&#xff0c;其他用户在观看网页时就会受到影响。这…

楼层滚动效果(超级简单,易懂)

系列文章目录 文章目录 系列文章目录一、楼层滚动效果图如下1. 下图是纯Css实现的楼层滚动2.通过Js优化后的楼层滚动如下图(&#x1f339;&#x1f339;) 二、楼层滚动&#xff08;Css实现&#xff09;1.滚动原理2.代码如下 三、楼层滚动&#xff08;JsCss优化后的楼层滚动&…

FreeRTOS学习笔记(二)——内核机制

文章目录 0x01 临界段Cortex-M内核快速关中断指令关中断开中断进入和退出临界段的宏进入临界段退出临界段临界段代码应用 0x02 空闲任务与阻塞延时的实现空闲任务的创建实现阻塞延时阻塞等待总结 0x03 多优先级通用方法&#xff1a;taskRECORD_READY_PRIORITY()taskSELECT_HIGH…

微服务学习——服务异步通讯

实用篇-RabbitMQ 初识MQ 同步调用的问题 微服务间基于Feign的调用就属于同步方式&#xff0c;存在一些问题。 耦合度高 每次加入新的需求&#xff0c;都要修改原来的代码性能下降 调用者需要等待服务提供者响应&#xff0c;如果调用链过长则响应时间等于每次调用的时间之和…

【数据库】事务的隔离级别以及实现原理

文章目录 前言一、事务什么是事务&#xff1f;事务的四大特性分别是 二、事务并发存在的问题脏读可重复读不可重复读幻读 三、以MYSQL数据库来分析四种隔离级别第一种隔离级别&#xff1a;Read uncommitted(读未提交)第二种隔离级别&#xff1a;Read committed(读提交)第三种隔…

此环境变量太大,此对话框允许将值设置为最长 2047 个字符

背景: 自己是一个计算机爱好者&#xff0c;又大体精通计算机各种编程语言&#xff0c;所以电脑上安装的各种编译或者编程软件比较多&#xff0c;有一天需要安装一个多版本的python环境&#xff0c;发现无法添加环境变量&#xff0c;于是乎&#xff0c;自己去查看原因并解决这个…

C语言 sizeof, size_t, strlen

C语言 sizeof, size_t, strlen 文章目录 C语言 sizeof, size_t, strlen一. sizeof1.1 返回结构体长度 二. size_t三. sizeof 和 strlen 一. sizeof 返回一个结构体或者类型所占的内存字节数 1.1 返回结构体长度 这里我编写了2个结构体&#xff0c;区别在于数组问题 #include …

智慧园区gis三维数字孪生可视化平台辅助管理者提升安全管控效力

随着信息技术的发展,3D可视化已经成为交互式管理的主流。智慧3D可视化交互管理平台能够帮助企业实现高效、灵活的管理。 1&#xff1a;智慧3D可视化交互管理平台的基本特性 智慧3D可视化交互管理平台能够实时显示工厂中生产车间的设备和生产线的运行状态&#xff0c;并通过交互…

火焰图怎么看

性能平台 通过该平台可以使用pprof采集线上的服务指标数据生成CPU占用数据并自动绘制出火焰图&#xff0c;Top&#xff0c;以及函数调用图等。 1.1 火焰图 火焰图的深度代表了函数的调用栈&#xff0c;火焰图最深处就是正在执行的函数&#xff0c;上方的都是它的父函数&#x…

C++线程的简单学习及了解

此篇文章只是线程的简单了解。 文章目录 前言一、线程的优缺点二、C线程库 1.thread类的简单介绍2.线程函数参数总结 前言 什么是线程&#xff1f; 在一个程序里的一个执行路线就叫做线程&#xff08;thread&#xff09;。更准确的定义是&#xff1a;线程是“一个进程内部的控…

git 使用大全及各种疑难杂症解决方法(长期更新)

Git使用中遇到的各种问题及解决方法 git clone后修改文件然后再上传覆盖 git push出现“Everything up-to-date”解决方法 git commit后如何撤销或修改 git 同步远程和本地的同名分支 git push异常问题出现符号解决方法 git 删除最近或者任意一次提交commit

Http详解

一、什么是Http协议 Http全称为超文本传输协议&#xff0c;是目前使用最主流的 应用层协议&#xff0c; 二、Http工作过程 当我们在浏览器中输入一个 “网址”, 此时浏览器就会给对应的服务器发送⼀个 HTTP 请求. 对方服务器收到这个请求之后, 经过计算处理, 就会返回⼀个 …

DAY06_常用API上

1&#xff1a;API 概述 1.1 API概述 如何自己设计对象并使用 获取已有对象并使用 而关于第一块知识&#xff1a;学习如何自己设计对象并使用&#xff0c;现在已经有一些基础了。 API(Application Programming Interface) &#xff1a;应用程序编程接口 那如何理解应用程序…

软件测试技术(四)白盒测试

白盒测试 白盒测试&#xff08;White Box Testing&#xff09;又称结构测试、透明盒测试、逻辑驱动测试或基于代码的测试。白盒测试只测试软件产品的内部结构和处理过程&#xff0c;而不测试软件产品的功能&#xff0c;用于纠正软件系统在描述、表示和规格上的错误&#xff0c…

IDEA弹出`Lombok requires enabled annotation processing`错误信息

问题背景 项目启动时&#xff0c;弹出一个报错窗口 问题原因 当您使用 Lombok 库时&#xff0c;您可能会遇到Lombok requires enabled annotation processing的错误消息。这是因为 Lombok 库使用了 Java 注解处理器&#xff08;annotation processor&#xff09;&#xff0c;而…

MySQL学习笔记第四天

第04章运算符 3.逻辑运算符 逻辑运算符主要用来判断表达式的真假&#xff0c;在MySQL中&#xff0c;逻辑运算符的返回结果为1、0或者NULL。 MySQL中支持4种逻辑运算符如下&#xff1a; 3.1逻辑非运算符 逻辑非&#xff08;NOT或!&#xff09;运算符表示当给定的值为0时返回…