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 };