/** * selectValueType 功能辅助工具 * 用于处理表单选择组件的值存储模式转换 */ /** * 根据selectValueType预处理options数据 * @param {Array} options - 原始选项数据 * @param {string} selectValueType - 值存储类型:'value' | 'label' | 'both' * @returns {Array} 处理后的选项数据 */ export function processOptionsForValueType(options, selectValueType = 'value') { // value模式:不做任何改变,保持现有逻辑 if (selectValueType === 'value') { return options } // label模式:交换value和label,保存原始value到originValue if (selectValueType === 'label') { return processOptionsForLabelType(options) } // both模式:不处理options return options } /** * 处理label模式的options数据转换 * @param {Array} options - 原始选项数据 * @returns {Array} 转换后的选项数据 */ export function processOptionsForLabelType(options) { if (!Array.isArray(options)) { return options } return options.map((item) => { // 先创建基础的转换对象 const transformedItem = { ...item } // 处理各种数据格式的属性转换 if (item.value !== undefined && item.label !== undefined) { // 标准格式 {value, label} transformedItem.originValue = item.value transformedItem.value = item.label } else if (item.key !== undefined && item.title !== undefined) { // 兼容格式 {key, title} transformedItem.originValue = item.key transformedItem.value = item.title transformedItem.label = item.title } else if (item.value !== undefined && item.text !== undefined) { // 字典格式 {value, text} transformedItem.originValue = item.value transformedItem.value = item.text transformedItem.label = item.text } else if (item.value !== undefined) { // 其他情况,尝试从多个可能的标签字段获取 const labelValue = item.label || item.title || item.text if (labelValue !== undefined) { transformedItem.originValue = item.value transformedItem.value = labelValue } } // 处理树形结构(递归处理children) if (item.children && Array.isArray(item.children)) { transformedItem.children = processOptionsForLabelType(item.children) } return transformedItem }) } /** * 根据value查找对应的label(支持单选和多选) * @param {any} value - 要查找的值 * @param {Array} options - 选项数据 * @returns {string | Array | null} 对应的label值,找不到时返回null */ export function findLabelByValue(value, options) { if (value === undefined || value === null) { return null } // 多选情况:value是数组 if (Array.isArray(value)) { const labels = [] for (const val of value) { const label = findSingleLabelByValue(val, options) if (label !== null) { labels.push(label) } } return labels.length > 0 ? labels : null } // 单选情况:value是单个值 return findSingleLabelByValue(value, options) } /** * 在选项数据中查找单个value对应的label(支持树形结构递归查找) * @param {any} value - 要查找的值 * @param {Array} options - 选项数据 * @returns {string} 对应的label值,找不到时返回String(value)作为fallback */ export function findSingleLabelByValue(value, options) { if (!Array.isArray(options)) { return String(value) } for (const item of options) { // 处理标准格式 {value, label} if (item.value !== undefined && String(item.value) === String(value)) { return item.label || item.title || item.text || String(value) } // 处理兼容格式 {key, title} if (item.key !== undefined && String(item.key) === String(value)) { return item.title || item.label || item.text || String(value) } // 递归查找树形结构 if (item.children && Array.isArray(item.children)) { const childLabel = findSingleLabelByValue(value, item.children) // 只有找到真正匹配项时才返回(不是fallback的String(value)) if (childLabel !== String(value)) { return childLabel } } } // 如果找不到对应的label,降级返回原值 return String(value) } /** * 处理 label 模式数据存储 * @param {object} form - 表单对象 * @param {string} fieldName - 字段名 * @param {any} currentValue - 当前值 * @param {Array} options - 选项数据 */ export function processLabelModeData(form, fieldName, currentValue, options) { // 确保 originData 对象存在 if (!form.originData) { form.originData = {} } // 获取当前值对应的原始值 const originValue = getOriginValue(currentValue, options) // 存储原始值到 originData 中 form.originData[fieldName] = originValue } /** * 处理 both 模式数据存储 * @param {object} form - 表单对象 * @param {string} fieldName - 字段名 * @param {any} currentValue - 当前值 * @param {Array} options - 选项数据 */ export function processBothModeData(form, fieldName, currentValue, options) { // 确保 labelData 对象存在 if (!form.labelData) { form.labelData = {} } // 获取当前值对应的标签值 const labelValue = findLabelByValue(currentValue, options) // 存储标签值到 labelData 中 if (labelValue !== null && labelValue !== undefined) { form.labelData[fieldName] = labelValue } } /** * 获取原始值(用于label模式时获取originValue) * @param {any} currentValue - 当前值 * @param {Array} options - 选项数据 * @returns {any} 原始值,找不到时返回currentValue作为fallback */ export function getOriginValue(currentValue, options) { console.log('getOriginValue', options) if (!Array.isArray(options) || currentValue === undefined || currentValue === null) { return currentValue } // 多选情况 if (Array.isArray(currentValue)) { const originValues = [] for (const val of currentValue) { const originVal = findOriginValueByLabel(val, options) // 只有找到真正的原始值时才使用originVal(不是fallback值) if (originVal !== val) { originValues.push(originVal) } else { // 如果没找到原始值,保留当前值 originValues.push(val) } } return originValues } // 单选情况 return findOriginValueByLabel(currentValue, options) } /** * 根据label查找原始value值 * @param {any} label - 标签值 * @param {Array} options - 选项数据 * @returns {any} 原始值,找不到时返回label作为fallback */ function findOriginValueByLabel(label, options) { for (const item of options) { // 如果有originValue,说明是经过label模式转换的 if (item.originValue !== undefined && String(item.value) === String(label)) { return item.originValue } // 递归查找树形结构 if (item.children && Array.isArray(item.children) && item.children.length > 0) { const childOriginValue = findOriginValueByLabel(label, item.children) // 只有当找到真正的匹配项时才返回(不等于传入的label) if (childOriginValue !== label) { return childOriginValue } } } return label // 如果找不到,返回原值 } /** * 创建selectValueType处理器的工厂函数 * @returns {object} 处理器对象 */ export function createSelectValueTypeHandler() { return { // 预处理options数据 processOptions(options, selectValueType) { return processOptionsForValueType(options, selectValueType) }, // 查找label值 findLabel(value, options) { return findLabelByValue(value, options) }, // 处理both模式数据 processBothMode(form, fieldName, currentValue, options) { return processBothModeData(form, fieldName, currentValue, options) }, // 处理label模式数据 processLabelMode(form, fieldName, currentValue, options) { return processLabelModeData(form, fieldName, currentValue, options) }, // 获取原始值 getOriginValue(currentValue, options) { return getOriginValue(currentValue, options) }, } } export default { processOptionsForValueType, processOptionsForLabelType, findLabelByValue, findSingleLabelByValue, processLabelModeData, processBothModeData, getOriginValue, createSelectValueTypeHandler, }