Files
klp-oa/klp-ui/src/components/ChinaAreaSelect/index.js

85 lines
3.5 KiB
JavaScript
Raw Normal View History

import areaData from './data.js';
/**
* 辅助函数将code数组/字符串转为name字符串
* @param {String|Array} codeVal - "110000/110101" ["110000", "110101"]
* @returns {String} "北京市/东城区"
*/
function convertCodeToName(codeVal) {
if (!codeVal) return '';
const codeArr = Array.isArray(codeVal) ? codeVal : codeVal.split('/').filter(Boolean);
return codeArr.map(code => areaData[code] || '').filter(Boolean).join('/');
}
/**
* 格式化/解析区域地址文本兼容[标准地址](自定义地址)格式
* @param {String|Object} value - 输入值
* - 字符串 "[北京市/东城区](XX街道1号)""北京市/东城区"""
* - 对象{ standard: '北京市/东城区', custom: 'XX街道1号' }
* @returns {Object|String} 输出规则
* - 输入为字符串 返回结构化对象 { standard: '', custom: '' }
* - 输入为对象 返回格式化后的组合字符串 "[标准地址](自定义地址)"
* - 输入为空/非预期类型 返回空字符串对象模式或空结构字符串模式
*/
function formatAreaText(value) {
// 核心正则:匹配「[标准地址](自定义地址)」格式,分组提取标准地址和自定义地址
const areaReg = /^\[([^\]]*)\]\(([^)]*)\)$/;
// ========== 场景1输入为空/非预期类型 → 容错返回 ==========
if (!value || (typeof value !== 'string' && typeof value !== 'object')) {
// 输入非字符串/对象 → 按类型返回默认值
return typeof value === 'object' ? '' : { standard: '', custom: '' };
}
// ========== 场景2输入是字符串 → 解析为结构化对象 ==========
if (typeof value === 'string') {
// 去除首尾空格
const trimVal = value.trim();
// 空字符串 → 返回空结构
if (!trimVal) return { standard: '', custom: '' };
// 匹配「[标准地址](自定义地址)」格式
const matchResult = trimVal.match(areaReg);
if (matchResult) {
// 提取分组值并去空格
const standard = matchResult[1]?.trim() || '';
const custom = matchResult[2]?.trim() || '';
return { standard, custom };
}
// 非组合格式(纯标准地址/纯自定义地址)→ 默认归为standard
return { standard: trimVal, custom: '' };
}
// ========== 场景3输入是对象 → 格式化为组合字符串 ==========
if (typeof value === 'object' && !Array.isArray(value)) {
const { standard = '', custom = '' } = value;
// 转字符串并去空格
const standardStr = String(standard).trim();
const customStr = String(custom).trim();
// 组合为「[标准地址](自定义地址)」格式
return `[${standardStr}](${customStr})`;
}
// 兜底:其他情况返回空(如数组输入)
return typeof value === 'object' ? '' : { standard: '', custom: '' };
}
/**
* 增强版支持code自动转name的格式化函数
*/
function formatAreaTextEnhanced(value, keyType = 'name') {
// 先调用基础版解析/格式化
const result = formatAreaText(value);
// 如果是解析模式返回对象且keyType为name转换code为name
if (typeof result === 'object' && keyType === 'name') {
result.standard = convertCodeToName(result.standard);
}
return result;
}
// 输出:{ standard: "北京市/东城区", custom: "XX街道1号" }
export { formatAreaTextEnhanced };