From ab9bcd61e172278c6d5b49e84a2aaf9fb59ccff2 Mon Sep 17 00:00:00 2001 From: zhujingjing Date: Sat, 11 Nov 2023 16:13:36 +0800 Subject: [PATCH] two new functions added --- lib/commons/str-utils.d.ts | 19 ++++++++ lib/index.d.ts | 4 +- lib/index.es.js | 45 ++++++++++++------- lib/index.es.js.map | 2 +- lib/index.umd.js | 2 +- lib/index.umd.js.map | 2 +- src/commons/str-utils.ts | 88 +++++++++++++++++++++++++++----------- src/index.ts | 4 +- 8 files changed, 119 insertions(+), 47 deletions(-) diff --git a/lib/commons/str-utils.d.ts b/lib/commons/str-utils.d.ts index 7e5eb4d..7212110 100644 --- a/lib/commons/str-utils.d.ts +++ b/lib/commons/str-utils.d.ts @@ -7,3 +7,22 @@ * @return {(str: string) => T[]} - 分词器函数。 */ export declare function stringTokenizer(regExp: RegExp, matchHandler: (text: string, match: boolean) => T, textHandler?: (text: string, match: boolean) => T): (str: string) => T[]; +/** + * 该函数接受两个参数,判断它们是否相等,不区分大小写。 + * 如果参数都是字符串类型,则将它们转换为小写后比较。 + * 如果两个参数都是undefined,则返回true, + * 否则返回false。 + * @param source + * @param target + * @returns + */ +export declare function equalsIgnoreCase(source: string | undefined, target: string | undefined): boolean; +/** + * 这个函数接受一个字符串数组和一个字符串作为参数, + * 在数组中判断是否存在与搜索字符串相同或相似的字符串,忽略大小写。 + * 如果找到匹配项则返回true,否则返回false。 + * @param list 字符串数组 + * @param search 用来搜索的字符串 + * @returns 是否包含 + */ +export declare const includeIgnoreCase: (list: string[], search: string) => boolean; diff --git a/lib/index.d.ts b/lib/index.d.ts index f324584..09592a1 100644 --- a/lib/index.d.ts +++ b/lib/index.d.ts @@ -1,3 +1,3 @@ import { withRecord } from "./commons/record-util"; -import { stringTokenizer } from "./commons/str-utils"; -export { stringTokenizer, withRecord }; +import { stringTokenizer, equalsIgnoreCase, includeIgnoreCase } from "./commons/str-utils"; +export { stringTokenizer, withRecord, equalsIgnoreCase, includeIgnoreCase }; diff --git a/lib/index.es.js b/lib/index.es.js index bfcf0f6..01d886a 100644 --- a/lib/index.es.js +++ b/lib/index.es.js @@ -1,9 +1,9 @@ -const u = (e) => ({ +const h = (e) => ({ clear: function(t = 2) { - t === 1 ? Object.keys(e).forEach((c) => { - e[c] = void 0; - }) : t === 2 ? Object.keys(e).forEach((c) => { - delete e[c]; + t === 1 ? Object.keys(e).forEach((n) => { + e[n] = void 0; + }) : t === 2 ? Object.keys(e).forEach((n) => { + delete e[n]; }) : Object.assign(e, {}); }, replace: function(t) { @@ -13,20 +13,33 @@ const u = (e) => ({ ), Object.assign(e, t); } }); -function a(e, t, c) { - const r = t, l = c || t; - return function(n) { - const s = [], h = n.matchAll(e); - let i = 0; - for (const f of h) { - const o = n.slice(i, f.index); - o && s.push(l(o, !1)), s.push(r(f[0], !0)), i = f.index + f[0].length; +function g(e, t, n) { + const f = t, o = n || t; + return function(i) { + const s = [], u = i.matchAll(e); + let r = 0; + for (const c of u) { + const l = i.slice(r, c.index); + l && s.push(o(l, !1)), s.push(f(c[0], !0)), r = c.index + c[0].length; } - return i < n.length && s.push(l(n.slice(i), !1)), s; + return r < i.length && s.push(o(i.slice(r), !1)), s; }; } +function a(e, t) { + return typeof e == "string" && typeof t == "string" ? e.toLowerCase() === t.toLowerCase() : e === void 0 && t === void 0; +} +const p = (e, t) => { + for (let n = 0; n < e.length; n++) { + let f = e[n]; + if (a(f, t)) + return !0; + } + return !1; +}; export { - a as stringTokenizer, - u as withRecord + a as equalsIgnoreCase, + p as includeIgnoreCase, + g as stringTokenizer, + h as withRecord }; //# sourceMappingURL=index.es.js.map diff --git a/lib/index.es.js.map b/lib/index.es.js.map index 3381921..9402ca1 100644 --- a/lib/index.es.js.map +++ b/lib/index.es.js.map @@ -1 +1 @@ -{"version":3,"file":"index.es.js","sources":["../src/commons/record-util.ts","../src/commons/str-utils.ts"],"sourcesContent":["import { UnwrapNestedRefs } from 'vue';\r\nenum ClearMode {\r\n clear = 3,\r\n delete = 2,\r\n reset = 1\r\n}\r\nexport const withRecord = (\r\n obj: UnwrapNestedRefs>,\r\n) => {\r\n\r\n return {\r\n clear: function (mode: ClearMode = ClearMode.delete) {\r\n if (mode === ClearMode.reset) {\r\n Object.keys(obj).forEach((key) => {\r\n obj[key] = undefined;\r\n });\r\n } else if (mode === ClearMode.delete) {\r\n Object.keys(obj).forEach((key) => {\r\n delete obj[key];\r\n });\r\n } else {\r\n Object.assign(obj, {});\r\n }\r\n },\r\n replace: function (newVal: UnwrapNestedRefs>) {\r\n this.clear(ClearMode.clear);\r\n Object.assign(obj, newVal);\r\n }\r\n };\r\n};","/**\r\n * 生成给定函数体的函数注释。\r\n *\r\n * @param {RegExp} regExp - 用于匹配的正则表达式。\r\n * @param {(text: string, match: boolean) => T} matchHandler - 处理匹配到的文本的函数。\r\n * @param {(text: string, match: boolean) => T} [textHandler] - 处理未匹配到的文本的函数。\r\n * @return {(str: string) => T[]} - 分词器函数。\r\n */\r\n export function stringTokenizer(\r\n regExp: RegExp,\r\n matchHandler: (text: string, match: boolean) => T,\r\n textHandler?: (text: string, match: boolean) => T\r\n ): (str: string) => T[] {\r\n\r\n const ifMatch = matchHandler;\r\n const ifText = textHandler?textHandler: matchHandler;\r\n\r\n return function (str: string) {\r\n const result: T[] = [];\r\n const matches = str.matchAll(regExp);\r\n let index = 0;\r\n for (const match of matches) {\r\n const before = str.slice(index, match.index);\r\n if (before) {\r\n result.push(ifText(before, false));\r\n }\r\n result.push(ifMatch(match[0], true));\r\n index = match.index! + match[0].length;\r\n }\r\n if (index < str.length) {\r\n result.push(ifText(str.slice(index), false));\r\n }\r\n return result;\r\n };\r\n }"],"names":["withRecord","obj","mode","key","newVal","stringTokenizer","regExp","matchHandler","textHandler","ifMatch","ifText","str","result","matches","index","match","before"],"mappings":"AAMa,MAAAA,IAAa,CACtBC,OAGO;AAAA,EACH,OAAO,SAAUC,IAAkB,GAAkB;AACjD,IAAIA,MAAS,IACT,OAAO,KAAKD,CAAG,EAAE,QAAQ,CAACE,MAAQ;AAC9B,MAAAF,EAAIE,CAAG,IAAI;AAAA,IAAA,CACd,IACMD,MAAS,IAChB,OAAO,KAAKD,CAAG,EAAE,QAAQ,CAACE,MAAQ;AAC9B,aAAOF,EAAIE,CAAG;AAAA,IAAA,CACjB,IAEM,OAAA,OAAOF,GAAK,CAAA,CAAE;AAAA,EAE7B;AAAA,EACA,SAAS,SAAUG,GAA+C;AAC9D,SAAK;AAAA,MAAM;AAAA;AAAA,OACJ,OAAA,OAAOH,GAAKG,CAAM;AAAA,EAC7B;AAAA;ACnBU,SAAAC,EACdC,GACAC,GACAC,GACsB;AAEtB,QAAMC,IAAUF,GACVG,IAASF,KAAyBD;AAExC,SAAO,SAAUI,GAAa;AAC5B,UAAMC,IAAc,CAAA,GACdC,IAAUF,EAAI,SAASL,CAAM;AACnC,QAAIQ,IAAQ;AACZ,eAAWC,KAASF,GAAS;AAC3B,YAAMG,IAASL,EAAI,MAAMG,GAAOC,EAAM,KAAK;AAC3C,MAAIC,KACFJ,EAAO,KAAKF,EAAOM,GAAQ,EAAK,CAAC,GAEnCJ,EAAO,KAAKH,EAAQM,EAAM,CAAC,GAAG,EAAI,CAAC,GACnCD,IAAQC,EAAM,QAASA,EAAM,CAAC,EAAE;AAAA,IAClC;AACI,WAAAD,IAAQH,EAAI,UACdC,EAAO,KAAKF,EAAOC,EAAI,MAAMG,CAAK,GAAG,EAAK,CAAC,GAEtCF;AAAA,EAAA;AAEX;"} \ No newline at end of file +{"version":3,"file":"index.es.js","sources":["../src/commons/record-util.ts","../src/commons/str-utils.ts"],"sourcesContent":["import { UnwrapNestedRefs } from 'vue';\r\nenum ClearMode {\r\n clear = 3,\r\n delete = 2,\r\n reset = 1\r\n}\r\nexport const withRecord = (\r\n obj: UnwrapNestedRefs>,\r\n) => {\r\n\r\n return {\r\n clear: function (mode: ClearMode = ClearMode.delete) {\r\n if (mode === ClearMode.reset) {\r\n Object.keys(obj).forEach((key) => {\r\n obj[key] = undefined;\r\n });\r\n } else if (mode === ClearMode.delete) {\r\n Object.keys(obj).forEach((key) => {\r\n delete obj[key];\r\n });\r\n } else {\r\n Object.assign(obj, {});\r\n }\r\n },\r\n replace: function (newVal: UnwrapNestedRefs>) {\r\n this.clear(ClearMode.clear);\r\n Object.assign(obj, newVal);\r\n }\r\n };\r\n};","/**\r\n * 生成给定函数体的函数注释。\r\n *\r\n * @param {RegExp} regExp - 用于匹配的正则表达式。\r\n * @param {(text: string, match: boolean) => T} matchHandler - 处理匹配到的文本的函数。\r\n * @param {(text: string, match: boolean) => T} [textHandler] - 处理未匹配到的文本的函数。\r\n * @return {(str: string) => T[]} - 分词器函数。\r\n */\r\nexport function stringTokenizer(\r\n regExp: RegExp,\r\n matchHandler: (text: string, match: boolean) => T,\r\n textHandler?: (text: string, match: boolean) => T\r\n): (str: string) => T[] {\r\n\r\n const ifMatch = matchHandler;\r\n const ifText = textHandler?textHandler: matchHandler;\r\n\r\n return function (str: string) {\r\n const result: T[] = [];\r\n const matches = str.matchAll(regExp);\r\n let index = 0;\r\n for (const match of matches) {\r\n const before = str.slice(index, match.index);\r\n if (before) {\r\n result.push(ifText(before, false));\r\n }\r\n result.push(ifMatch(match[0], true));\r\n index = match.index! + match[0].length;\r\n }\r\n if (index < str.length) {\r\n result.push(ifText(str.slice(index), false));\r\n }\r\n return result;\r\n };\r\n}\r\n\r\n/**\r\n * 该函数接受两个参数,判断它们是否相等,不区分大小写。\r\n * 如果参数都是字符串类型,则将它们转换为小写后比较。\r\n * 如果两个参数都是undefined,则返回true,\r\n * 否则返回false。\r\n * @param source \r\n * @param target \r\n * @returns \r\n */\r\nexport function equalsIgnoreCase(\r\n source: string | undefined,\r\n target: string | undefined\r\n) {\r\n if (typeof source === \"string\" && typeof target === \"string\") {\r\n return source.toLowerCase() === target.toLowerCase();\r\n } else if (source === undefined && target === undefined) {\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * 这个函数接受一个字符串数组和一个字符串作为参数,\r\n * 在数组中判断是否存在与搜索字符串相同或相似的字符串,忽略大小写。\r\n * 如果找到匹配项则返回true,否则返回false。\r\n * @param list 字符串数组\r\n * @param search 用来搜索的字符串\r\n * @returns 是否包含\r\n */\r\nexport const includeIgnoreCase = (list: string[], search: string) => {\r\n for (let i = 0; i < list.length; i++) {\r\n let item = list[i];\r\n if (equalsIgnoreCase(item, search)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n};\r\n\r\n"],"names":["withRecord","obj","mode","key","newVal","stringTokenizer","regExp","matchHandler","textHandler","ifMatch","ifText","str","result","matches","index","match","before","equalsIgnoreCase","source","target","includeIgnoreCase","list","search","i","item"],"mappings":"AAMa,MAAAA,IAAa,CACtBC,OAGO;AAAA,EACH,OAAO,SAAUC,IAAkB,GAAkB;AACjD,IAAIA,MAAS,IACT,OAAO,KAAKD,CAAG,EAAE,QAAQ,CAACE,MAAQ;AAC9B,MAAAF,EAAIE,CAAG,IAAI;AAAA,IAAA,CACd,IACMD,MAAS,IAChB,OAAO,KAAKD,CAAG,EAAE,QAAQ,CAACE,MAAQ;AAC9B,aAAOF,EAAIE,CAAG;AAAA,IAAA,CACjB,IAEM,OAAA,OAAOF,GAAK,CAAA,CAAE;AAAA,EAE7B;AAAA,EACA,SAAS,SAAUG,GAA+C;AAC9D,SAAK;AAAA,MAAM;AAAA;AAAA,OACJ,OAAA,OAAOH,GAAKG,CAAM;AAAA,EAC7B;AAAA;ACnBQ,SAAAC,EACdC,GACAC,GACAC,GACsB;AAEtB,QAAMC,IAAUF,GACVG,IAASF,KAAyBD;AAExC,SAAO,SAAUI,GAAa;AAC5B,UAAMC,IAAc,CAAA,GACdC,IAAUF,EAAI,SAASL,CAAM;AACnC,QAAIQ,IAAQ;AACZ,eAAWC,KAASF,GAAS;AAC3B,YAAMG,IAASL,EAAI,MAAMG,GAAOC,EAAM,KAAK;AAC3C,MAAIC,KACFJ,EAAO,KAAKF,EAAOM,GAAQ,EAAK,CAAC,GAEnCJ,EAAO,KAAKH,EAAQM,EAAM,CAAC,GAAG,EAAI,CAAC,GACnCD,IAAQC,EAAM,QAASA,EAAM,CAAC,EAAE;AAAA,IAClC;AACI,WAAAD,IAAQH,EAAI,UACdC,EAAO,KAAKF,EAAOC,EAAI,MAAMG,CAAK,GAAG,EAAK,CAAC,GAEtCF;AAAA,EAAA;AAEX;AAWgB,SAAAK,EACdC,GACAC,GACA;AACA,SAAI,OAAOD,KAAW,YAAY,OAAOC,KAAW,WAC3CD,EAAO,YAAA,MAAkBC,EAAO,YAAY,IAC1CD,MAAW,UAAaC,MAAW;AAIhD;AAUa,MAAAC,IAAoB,CAACC,GAAgBC,MAAmB;AACnE,WAASC,IAAI,GAAGA,IAAIF,EAAK,QAAQE,KAAK;AAChC,QAAAC,IAAOH,EAAKE,CAAC;AACb,QAAAN,EAAiBO,GAAMF,CAAM;AACxB,aAAA;AAAA,EAEX;AACO,SAAA;AACT;"} \ No newline at end of file diff --git a/lib/index.umd.js b/lib/index.umd.js index 1b98ba2..ead6daa 100644 --- a/lib/index.umd.js +++ b/lib/index.umd.js @@ -1,2 +1,2 @@ -(function(n,c){typeof exports=="object"&&typeof module<"u"?c(exports):typeof define=="function"&&define.amd?define(["exports"],c):(n=typeof globalThis<"u"?globalThis:n||self,c(n["ez-common-ts"]={}))})(this,function(n){"use strict";const c=e=>({clear:function(t=2){t===1?Object.keys(e).forEach(i=>{e[i]=void 0}):t===2?Object.keys(e).forEach(i=>{delete e[i]}):Object.assign(e,{})},replace:function(t){this.clear(3),Object.assign(e,t)}});function h(e,t,i){const d=t,l=i||t;return function(s){const f=[],a=s.matchAll(e);let o=0;for(const u of a){const r=s.slice(o,u.index);r&&f.push(l(r,!1)),f.push(d(u[0],!0)),o=u.index+u[0].length}return o({clear:function(n=2){n===1?Object.keys(e).forEach(t=>{e[t]=void 0}):n===2?Object.keys(e).forEach(t=>{delete e[t]}):Object.assign(e,{})},replace:function(n){this.clear(3),Object.assign(e,n)}});function h(e,n,t){const u=n,a=t||n;return function(o){const f=[],p=o.matchAll(e);let c=0;for(const r of p){const d=o.slice(c,r.index);d&&f.push(a(d,!1)),f.push(u(r[0],!0)),c=r.index+r[0].length}return c{for(let t=0;t>,\r\n) => {\r\n\r\n return {\r\n clear: function (mode: ClearMode = ClearMode.delete) {\r\n if (mode === ClearMode.reset) {\r\n Object.keys(obj).forEach((key) => {\r\n obj[key] = undefined;\r\n });\r\n } else if (mode === ClearMode.delete) {\r\n Object.keys(obj).forEach((key) => {\r\n delete obj[key];\r\n });\r\n } else {\r\n Object.assign(obj, {});\r\n }\r\n },\r\n replace: function (newVal: UnwrapNestedRefs>) {\r\n this.clear(ClearMode.clear);\r\n Object.assign(obj, newVal);\r\n }\r\n };\r\n};","/**\r\n * 生成给定函数体的函数注释。\r\n *\r\n * @param {RegExp} regExp - 用于匹配的正则表达式。\r\n * @param {(text: string, match: boolean) => T} matchHandler - 处理匹配到的文本的函数。\r\n * @param {(text: string, match: boolean) => T} [textHandler] - 处理未匹配到的文本的函数。\r\n * @return {(str: string) => T[]} - 分词器函数。\r\n */\r\n export function stringTokenizer(\r\n regExp: RegExp,\r\n matchHandler: (text: string, match: boolean) => T,\r\n textHandler?: (text: string, match: boolean) => T\r\n ): (str: string) => T[] {\r\n\r\n const ifMatch = matchHandler;\r\n const ifText = textHandler?textHandler: matchHandler;\r\n\r\n return function (str: string) {\r\n const result: T[] = [];\r\n const matches = str.matchAll(regExp);\r\n let index = 0;\r\n for (const match of matches) {\r\n const before = str.slice(index, match.index);\r\n if (before) {\r\n result.push(ifText(before, false));\r\n }\r\n result.push(ifMatch(match[0], true));\r\n index = match.index! + match[0].length;\r\n }\r\n if (index < str.length) {\r\n result.push(ifText(str.slice(index), false));\r\n }\r\n return result;\r\n };\r\n }"],"names":["withRecord","obj","mode","key","newVal","stringTokenizer","regExp","matchHandler","textHandler","ifMatch","ifText","str","result","matches","index","match","before"],"mappings":"uOAMa,MAAAA,EACTC,IAGO,CACH,MAAO,SAAUC,EAAkB,EAAkB,CAC7CA,IAAS,EACT,OAAO,KAAKD,CAAG,EAAE,QAASE,GAAQ,CAC9BF,EAAIE,CAAG,EAAI,MAAA,CACd,EACMD,IAAS,EAChB,OAAO,KAAKD,CAAG,EAAE,QAASE,GAAQ,CAC9B,OAAOF,EAAIE,CAAG,CAAA,CACjB,EAEM,OAAA,OAAOF,EAAK,CAAA,CAAE,CAE7B,EACA,QAAS,SAAUG,EAA+C,CAC9D,KAAK,MAAM,GACJ,OAAA,OAAOH,EAAKG,CAAM,CAC7B,CAAA,GCnBU,SAAAC,EACdC,EACAC,EACAC,EACsB,CAEtB,MAAMC,EAAUF,EACVG,EAASF,GAAyBD,EAExC,OAAO,SAAUI,EAAa,CAC5B,MAAMC,EAAc,CAAA,EACdC,EAAUF,EAAI,SAASL,CAAM,EACnC,IAAIQ,EAAQ,EACZ,UAAWC,KAASF,EAAS,CAC3B,MAAMG,EAASL,EAAI,MAAMG,EAAOC,EAAM,KAAK,EACvCC,GACFJ,EAAO,KAAKF,EAAOM,EAAQ,EAAK,CAAC,EAEnCJ,EAAO,KAAKH,EAAQM,EAAM,CAAC,EAAG,EAAI,CAAC,EACnCD,EAAQC,EAAM,MAASA,EAAM,CAAC,EAAE,MAClC,CACI,OAAAD,EAAQH,EAAI,QACdC,EAAO,KAAKF,EAAOC,EAAI,MAAMG,CAAK,EAAG,EAAK,CAAC,EAEtCF,CAAA,CAEX"} \ No newline at end of file +{"version":3,"file":"index.umd.js","sources":["../src/commons/record-util.ts","../src/commons/str-utils.ts"],"sourcesContent":["import { UnwrapNestedRefs } from 'vue';\r\nenum ClearMode {\r\n clear = 3,\r\n delete = 2,\r\n reset = 1\r\n}\r\nexport const withRecord = (\r\n obj: UnwrapNestedRefs>,\r\n) => {\r\n\r\n return {\r\n clear: function (mode: ClearMode = ClearMode.delete) {\r\n if (mode === ClearMode.reset) {\r\n Object.keys(obj).forEach((key) => {\r\n obj[key] = undefined;\r\n });\r\n } else if (mode === ClearMode.delete) {\r\n Object.keys(obj).forEach((key) => {\r\n delete obj[key];\r\n });\r\n } else {\r\n Object.assign(obj, {});\r\n }\r\n },\r\n replace: function (newVal: UnwrapNestedRefs>) {\r\n this.clear(ClearMode.clear);\r\n Object.assign(obj, newVal);\r\n }\r\n };\r\n};","/**\r\n * 生成给定函数体的函数注释。\r\n *\r\n * @param {RegExp} regExp - 用于匹配的正则表达式。\r\n * @param {(text: string, match: boolean) => T} matchHandler - 处理匹配到的文本的函数。\r\n * @param {(text: string, match: boolean) => T} [textHandler] - 处理未匹配到的文本的函数。\r\n * @return {(str: string) => T[]} - 分词器函数。\r\n */\r\nexport function stringTokenizer(\r\n regExp: RegExp,\r\n matchHandler: (text: string, match: boolean) => T,\r\n textHandler?: (text: string, match: boolean) => T\r\n): (str: string) => T[] {\r\n\r\n const ifMatch = matchHandler;\r\n const ifText = textHandler?textHandler: matchHandler;\r\n\r\n return function (str: string) {\r\n const result: T[] = [];\r\n const matches = str.matchAll(regExp);\r\n let index = 0;\r\n for (const match of matches) {\r\n const before = str.slice(index, match.index);\r\n if (before) {\r\n result.push(ifText(before, false));\r\n }\r\n result.push(ifMatch(match[0], true));\r\n index = match.index! + match[0].length;\r\n }\r\n if (index < str.length) {\r\n result.push(ifText(str.slice(index), false));\r\n }\r\n return result;\r\n };\r\n}\r\n\r\n/**\r\n * 该函数接受两个参数,判断它们是否相等,不区分大小写。\r\n * 如果参数都是字符串类型,则将它们转换为小写后比较。\r\n * 如果两个参数都是undefined,则返回true,\r\n * 否则返回false。\r\n * @param source \r\n * @param target \r\n * @returns \r\n */\r\nexport function equalsIgnoreCase(\r\n source: string | undefined,\r\n target: string | undefined\r\n) {\r\n if (typeof source === \"string\" && typeof target === \"string\") {\r\n return source.toLowerCase() === target.toLowerCase();\r\n } else if (source === undefined && target === undefined) {\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * 这个函数接受一个字符串数组和一个字符串作为参数,\r\n * 在数组中判断是否存在与搜索字符串相同或相似的字符串,忽略大小写。\r\n * 如果找到匹配项则返回true,否则返回false。\r\n * @param list 字符串数组\r\n * @param search 用来搜索的字符串\r\n * @returns 是否包含\r\n */\r\nexport const includeIgnoreCase = (list: string[], search: string) => {\r\n for (let i = 0; i < list.length; i++) {\r\n let item = list[i];\r\n if (equalsIgnoreCase(item, search)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n};\r\n\r\n"],"names":["withRecord","obj","mode","key","newVal","stringTokenizer","regExp","matchHandler","textHandler","ifMatch","ifText","str","result","matches","index","match","before","equalsIgnoreCase","source","target","includeIgnoreCase","list","search","i","item"],"mappings":"uOAMa,MAAAA,EACTC,IAGO,CACH,MAAO,SAAUC,EAAkB,EAAkB,CAC7CA,IAAS,EACT,OAAO,KAAKD,CAAG,EAAE,QAASE,GAAQ,CAC9BF,EAAIE,CAAG,EAAI,MAAA,CACd,EACMD,IAAS,EAChB,OAAO,KAAKD,CAAG,EAAE,QAASE,GAAQ,CAC9B,OAAOF,EAAIE,CAAG,CAAA,CACjB,EAEM,OAAA,OAAOF,EAAK,CAAA,CAAE,CAE7B,EACA,QAAS,SAAUG,EAA+C,CAC9D,KAAK,MAAM,GACJ,OAAA,OAAOH,EAAKG,CAAM,CAC7B,CAAA,GCnBQ,SAAAC,EACdC,EACAC,EACAC,EACsB,CAEtB,MAAMC,EAAUF,EACVG,EAASF,GAAyBD,EAExC,OAAO,SAAUI,EAAa,CAC5B,MAAMC,EAAc,CAAA,EACdC,EAAUF,EAAI,SAASL,CAAM,EACnC,IAAIQ,EAAQ,EACZ,UAAWC,KAASF,EAAS,CAC3B,MAAMG,EAASL,EAAI,MAAMG,EAAOC,EAAM,KAAK,EACvCC,GACFJ,EAAO,KAAKF,EAAOM,EAAQ,EAAK,CAAC,EAEnCJ,EAAO,KAAKH,EAAQM,EAAM,CAAC,EAAG,EAAI,CAAC,EACnCD,EAAQC,EAAM,MAASA,EAAM,CAAC,EAAE,MAClC,CACI,OAAAD,EAAQH,EAAI,QACdC,EAAO,KAAKF,EAAOC,EAAI,MAAMG,CAAK,EAAG,EAAK,CAAC,EAEtCF,CAAA,CAEX,CAWgB,SAAAK,EACdC,EACAC,EACA,CACA,OAAI,OAAOD,GAAW,UAAY,OAAOC,GAAW,SAC3CD,EAAO,YAAA,IAAkBC,EAAO,YAAY,EAC1CD,IAAW,QAAaC,IAAW,MAIhD,CAUa,MAAAC,EAAoB,CAACC,EAAgBC,IAAmB,CACnE,QAASC,EAAI,EAAGA,EAAIF,EAAK,OAAQE,IAAK,CAChC,IAAAC,EAAOH,EAAKE,CAAC,EACb,GAAAN,EAAiBO,EAAMF,CAAM,EACxB,MAAA,EAEX,CACO,MAAA,EACT"} \ No newline at end of file diff --git a/src/commons/str-utils.ts b/src/commons/str-utils.ts index 824bff5..d41dfba 100644 --- a/src/commons/str-utils.ts +++ b/src/commons/str-utils.ts @@ -6,30 +6,70 @@ * @param {(text: string, match: boolean) => T} [textHandler] - 处理未匹配到的文本的函数。 * @return {(str: string) => T[]} - 分词器函数。 */ - export function stringTokenizer( - regExp: RegExp, - matchHandler: (text: string, match: boolean) => T, - textHandler?: (text: string, match: boolean) => T - ): (str: string) => T[] { +export function stringTokenizer( + regExp: RegExp, + matchHandler: (text: string, match: boolean) => T, + textHandler?: (text: string, match: boolean) => T +): (str: string) => T[] { - const ifMatch = matchHandler; - const ifText = textHandler?textHandler: matchHandler; + const ifMatch = matchHandler; + const ifText = textHandler?textHandler: matchHandler; - return function (str: string) { - const result: T[] = []; - const matches = str.matchAll(regExp); - let index = 0; - for (const match of matches) { - const before = str.slice(index, match.index); - if (before) { - result.push(ifText(before, false)); - } - result.push(ifMatch(match[0], true)); - index = match.index! + match[0].length; + return function (str: string) { + const result: T[] = []; + const matches = str.matchAll(regExp); + let index = 0; + for (const match of matches) { + const before = str.slice(index, match.index); + if (before) { + result.push(ifText(before, false)); } - if (index < str.length) { - result.push(ifText(str.slice(index), false)); - } - return result; - }; - } \ No newline at end of file + result.push(ifMatch(match[0], true)); + index = match.index! + match[0].length; + } + if (index < str.length) { + result.push(ifText(str.slice(index), false)); + } + return result; + }; +} + +/** + * 该函数接受两个参数,判断它们是否相等,不区分大小写。 + * 如果参数都是字符串类型,则将它们转换为小写后比较。 + * 如果两个参数都是undefined,则返回true, + * 否则返回false。 + * @param source + * @param target + * @returns + */ +export function equalsIgnoreCase( + source: string | undefined, + target: string | undefined +) { + if (typeof source === "string" && typeof target === "string") { + return source.toLowerCase() === target.toLowerCase(); + } else if (source === undefined && target === undefined) { + return true; + } + return false; +} + +/** + * 这个函数接受一个字符串数组和一个字符串作为参数, + * 在数组中判断是否存在与搜索字符串相同或相似的字符串,忽略大小写。 + * 如果找到匹配项则返回true,否则返回false。 + * @param list 字符串数组 + * @param search 用来搜索的字符串 + * @returns 是否包含 + */ +export const includeIgnoreCase = (list: string[], search: string) => { + for (let i = 0; i < list.length; i++) { + let item = list[i]; + if (equalsIgnoreCase(item, search)) { + return true; + } + } + return false; +}; + diff --git a/src/index.ts b/src/index.ts index 1fba179..99941e0 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,4 @@ import { withRecord } from "./commons/record-util"; -import { stringTokenizer } from "./commons/str-utils"; +import { stringTokenizer, equalsIgnoreCase, includeIgnoreCase } from "./commons/str-utils"; -export { stringTokenizer, withRecord }; +export { stringTokenizer, withRecord, equalsIgnoreCase, includeIgnoreCase };