123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- import { pinyin } from "pinyin-pro";
- import { isArray } from "./is/index";
- import { get } from "lodash-es";
- /**
- * @description 判断字符串str是否包含目标字符串tgStr的拼音形式。
- * @param str 待检查的字符串
- * @param tgStr 目标字符串,用于拼音匹配
- * @returns 如果str的拼音形式包含tgStr,则返回true;否则返回false。
- */
- const getMatch = (str: string, tgStr: string): boolean => {
- const result = pinyin(str, { toneType: "none", type: "array" });
- // 将拼音数组连接成字符串,用于完整拼音匹配
- let res = result.join("");
- if (res.includes(tgStr)) return true;
- // 将拼音数组的每个元素的首字母提取出来,然后连接成字符串,用于首字母拼音匹配
- res = result
- .map(p => p[0])
- .join("")
- .toLowerCase();
- return res.includes(tgStr);
- };
- /**
- * @description 拼音模糊查询数值
- * @param inputValue {string} 识别文本内容
- * @param totalList {array} 数据源,单层数组
- * @param props {array/string} 识别文本字段名
- * @returns array
- */
- export function pinyinFilter(inputValue: string, totalList: any, props: string | string[]) {
- // 完整拼音
- const pyInput = pinyin(inputValue, { toneType: "none", type: "array" }).join("");
- // Helper函数来检查节点是否匹配
- function isNodeMatch(node: any, prop: string): boolean {
- const value = String(get(node, prop, ""));
- return value.includes(inputValue) || getMatch(value, pyInput);
- }
- return totalList.filter((e: any) => {
- let ifMatch = false;
- if (isArray(props)) {
- for (let i = 0; i < props.length; i++) {
- if (isNodeMatch(e, props[i])) {
- ifMatch = true;
- break;
- }
- }
- } else {
- ifMatch = isNodeMatch(e, props);
- }
- return ifMatch;
- });
- }
- /**
- * @description 拼音模糊查询数值
- * @param inputValue {string} 识别文本内容
- * @param totalList {array} 数据源,支持多层数组
- * @param props {array/string} 识别文本字段名,支持“a.b"
- * @param childAttr {string} 子层级字段名, 默认为children
- * @returns array
- */
- export function pinyinFilterTree(inputValue: string, totalList: any, props: string | string[], childAttr: string = "children") {
- // 完整拼音
- const pyInput = pinyin(inputValue, { toneType: "none", type: "array" }).join("");
- // Helper函数来检查节点是否匹配
- function isNodeMatch(node: any, prop: string): boolean {
- const value = get(node, prop, "") as string;
- return value.includes(inputValue) || getMatch(value, pyInput);
- }
- return totalList
- .map((e: any) => {
- let ifMatch = false;
- if (isArray(props)) {
- for (let i = 0; i < props.length; i++) {
- if (isNodeMatch(e, props[i])) {
- ifMatch = true;
- break;
- }
- }
- } else {
- ifMatch = isNodeMatch(e, props);
- }
- if (ifMatch) return e;
- // 如果当前节点不匹配,但存在子节点,则递归处理子节点
- if (e.hasOwnProperty(childAttr) && e[childAttr].length > 0) {
- const filteredChildren = pinyinFilterTree(inputValue, e[childAttr], props, childAttr);
- if (filteredChildren.length > 0) {
- let _data = { ...e };
- _data[childAttr] = filteredChildren;
- return _data;
- }
- }
- return null;
- })
- .filter((node: any) => node !== null); // 过滤掉 null 节点
- }
|