/** * 基本的函数 * Created by GUY on 2015/6/24. */ import { every, isKey, isArray, toUpperCase, each, stripEL, isNotNull, isNull, isObject, flatten, isFunction } from "../2.base"; import { makeFirstPY } from "../utils/chinesePY"; import { CODE_INDEX } from "@/third/sort.gb2312"; import { MAX } from "../constant"; /** * 创建唯一的名字 * @param array * @param name * @returns {*} */ export function createDistinctName(array, name) { const src = name; let idx = 1; name = name || ""; while (true) { // eslint-disable-next-line no-loop-func if (every(array, (i, item) => isKey(item) ? item !== name : item.name !== name)) { break; } name = src + (idx++); } return name; } /** * 获取字符宽度 * @param str * @return {number} */ export function getGBWidth(str) { str = `${str}`; str = str.replace(/[^\x00-\xff]/g, "xx"); return Math.ceil(str.length / 2); } /** * 获取搜索结果 * @param items * @param keyword * @param param 搜索哪个属性 */ export function getSearchResult(items, keyword, param) { const array = isArray(items); items = array ? flatten(items) : items; param || (param = "text"); if (!isKey(keyword)) { return { find: items, match: array ? [] : {}, }; } let t, text, py; keyword = toUpperCase(keyword); const matched = array ? [] : {}, find = array ? [] : {}; each(items, (i, item) => { // 兼容item为null的处理 if (isNull(item)) { return; } t = stripEL(item); text = [t[param], t.text, t.value, t.name, t].find(isNotNull); if (isNull(text) || isObject(text)) return; py = makeFirstPY(text, { splitChar: "\u200b", }); text = toUpperCase(text); py = toUpperCase(py); let pidx; if (text.indexOf(keyword) > -1) { if (text === keyword) { array ? matched.push(item) : (matched[i] = item); } else { array ? find.push(item) : (find[i] = item); } } else { // BI-56386 这边两个pid / text.length是为了防止截取的首字符串不是完整的,但光这样做还不够,即时错位了,也不能说明就不符合条件 pidx = py.indexOf(keyword); if (pidx > -1) { if (text === keyword || keyword.length === text.length) { array ? matched.push(item) : (matched[i] = item); } else { array ? find.push(item) : (find[i] = item); } } } }); return { match: matched, find, }; } /** * 获取按GB2312排序的结果 * @param items * @param key * @return {any[]} */ export function getSortedResult(items, key = null) { const getTextOfItem = isFunction(key) ? key : function (item, key) { if (isNotNull(key)) { return item[key]; } if (isNotNull(item.text)) { return item.text; } if (isNotNull(item.value)) { return item.value; } return item; }; return items.sort((item1, item2) => { const str1 = getTextOfItem(item1, key); const str2 = getTextOfItem(item2, key); if (isNull(str1) && isNull(str2)) { return 0; } if (isNull(str1)) { return -1; } if (isNull(str2)) { return 1; } if (str1 === str2) { return 0; } const len1 = str1.length, len2 = str2.length; for (let i = 0; i < len1 && i < len2; i++) { const char1 = str1[i]; const char2 = str2[i]; if (char1 !== char2) { // 找不到的字符都往后面放 return (isNull(CODE_INDEX[char1]) ? MAX : CODE_INDEX[char1]) - (isNull(CODE_INDEX[char2]) ? MAX : CODE_INDEX[char2]); } } return len1 - len2; }); } export function beforeFunc(sFunc, func) { const __self = sFunc; return function () { if (func.apply(sFunc, arguments) === false) { return false; } return __self.apply(sFunc, arguments); }; } export function afterFunc(sFunc, func) { const __self = sFunc; return function () { const ret = __self.apply(sFunc, arguments); if (ret === false) { return false; } func.apply(sFunc, arguments); return ret; }; } export const Func = { createDistinctName, getGBWidth, getSearchResult, getSortedResult, };