/* * ✨ 字典工具类函数 ✨ * */ import utils from '../utils.js' /** * 通过字典编码获取字典 * @param {String} code 字典编码 * @return {Array} 字典 * @example * getDictionaryByCode('xxx') // 获取'xxx'字典编码对应的字典数组 * */ export function getDictionaryByCode(code = '') { if (!(typeof code === 'string' && code)) return [] return utils.getDictItemsFromCache(code) || [] } /** * 通过字典编码及其关联的value或name值获取级联字典 * @param {String} code 字典编码 * @param {String | Number} event 关联的value或name值 * @param {'value' | 'name'} [eventType = 'value'] 通过名称还是值获取级联字典 * @return {Array} 级联字典 * @example * getCascadeDictByCodeEvent(code,event) * */ export function getCascadeDictByCodeEvent(code, event, eventType = 'value') { const eventTypeArr = ['value', 'name'] // 限制eventType参数值 if (!eventTypeArr.includes(eventType)) return [] // 匹配级联字典对象 const cascadeDictObj = getDictionaryByCode(code).find(item => item[eventType] === event) ?.lowerDic || {} // 将级联字典对象转为二维数组后,合并所有字典 return Object.entries(cascadeDictObj).reduce( (concatDictArr, [_, dictArr = []]) => { if (!(Array.isArray(dictArr) && dictArr.length)) return concatDictArr return concatDictArr.concat(dictArr) }, [] ) } /** * 配置对象 * @typedef {Object} EscapeConfig * @property {String} [valueKey = 'value'] 需转义字段键名 * @property {String} [labelKey = 'name'] 对应字段键名 * @property {Boolean} [dictionaryType = true] true 为转义 false 为翻译 * @property {Boolean} [congruent = true] 匹配为全等于还是等于 * */ /** * 转义、翻译函数 * @param {Array | string} data 配置数组或字典编码 * @param {String} val 需转义内容 * @param {EscapeConfig} [escapeConfig] 配置对象 * @returns {String} 转义后的内容 * */ export function dictionaryEscape(data, val = '', escapeConfig = {}) { // 参数归一化 if (typeof data === 'string') data = getDictionaryByCode(data) if (!(Array.isArray(data) && data.length)) return '' escapeConfig = { valueKey: 'value', labelKey: 'name', dictionaryType: true, congruent: true, ...escapeConfig } const {valueKey, labelKey, dictionaryType, congruent} = escapeConfig const item = data.find(i => { const dictionaryValue = i[dictionaryType ? valueKey : labelKey] // 字典值 let condition = dictionaryValue === val // 返回条件 if (!congruent) condition = dictionaryValue == val return condition }) || {} return item[dictionaryType ? labelKey : valueKey] || '' }