以下是将数据转换为指定格式并实现双向转换的完整方案:
以下是将数据转换为指定格式并实现双向转换的完整方案:
// 编码函数:对象数组 => 安全字符串
function encodeDomains(data) {
return data.map(item =>
`${item.domain}|${item.weight}`
).join('||');
}
// 解码函数:安全字符串 => 对象数组
function decodeDomains(str) {
return str.split('||')
.filter(Boolean)
.map(part => {
const [domain, weight] = part.split('|');
return {
domain: domain.trim(),
weight: Number(weight) || 1 // 默认权重为1
};
});
}
// 示例数据
const originalData = [
{ domain: 'https://img1.example.com', weight: 3 },
{ domain: 'https://img2.example.com', weight: 2 },
{ domain: 'https://img3.example.com', weight: 1 }
];
// 转换演示
const encodedString = encodeDomains(originalData);
console.log('编码结果:', encodedString);
// 输出:https://img1.example.com|3||https://img2.example.com|2||https://img3.example.com|1
const decodedData = decodeDomains(encodedString);
console.log('解码结果:', decodedData);
/* 输出:
[
{ domain: 'https://img1.example.com', weight: 3 },
{ domain: 'https://img2.example.com', weight: 2 },
{ domain: 'https://img3.example.com', weight: 1 }
]
*/
// 边缘情况测试
console.log(decodeDomains('')); // 输出空数组 []
console.log(decodeDomains('https://test.com|5')); // 输出单元素数组
功能扩展建议
- 添加数据校验
function safeEncode(data) {
return data
.filter(item =>
typeof item.domain === 'string' &&
typeof item.weight === 'number' &&
item.weight > 0
)
.map(item =>
`${encodeURIComponent(item.domain)}|${item.weight}`
)
.join('||');
}
- 支持带特殊字符的域名
// 编码时
const encoded = encodeURIComponent(domain);
// 解码时
const decoded = decodeURIComponent(domain);
- 添加缓存机制
const domainCache = new Map();
function getDomainList(str) {
if (domainCache.has(str)) {
return domainCache.get(str);
}
const data = decodeDomains(str);
domainCache.set(str, data);
return data;
}
使用场景示例
- 存储到 localStorage
// 保存
localStorage.setItem('cdnConfig', encodeDomains(originalData));
// 读取
const restoredData = decodeDomains(localStorage.getItem('cdnConfig') || '');
- URL参数传递
// 设置URL参数
const params = new URLSearchParams();
params.set('cdn', encodeDomains(originalData));
window.location.search = params.toString();
// 读取URL参数
const urlData = decodeDomains(new URLSearchParams(window.location.search).get('cdn') || '');
- React组件中使用
function DomainList({ encodedString }) {
const domains = decodeDomains(encodedString);
return (
<ul>
{domains.map((item, index) => (
<li key={index}>
{item.domain} (权重:{item.weight})
</li>
))}
</ul>
);
}
// 使用示例
<DomainList encodedString="https://img1.example.com|3||https://img2.example.com|2" />
注意事项
- 数据安全性
- 避免直接使用
eval()
解析 - 对输入数据进行消毒处理
- 限制最大权重值(如 1-10)
- 性能优化
// 使用 Web Worker 处理大数据
const worker = new Worker('domain-processor.js');
worker.postMessage(encodeDomains(largeData));
- 类型约束
// TypeScript 类型定义
interface DomainConfig {
domain: string;
weight: number;
}
function encodeDomains(data: DomainConfig[]): string {
// 实现同上
}
function decodeDomains(str: string): DomainConfig[] {
// 实现同上
}
该方案可以安全地在以下场景使用:
- URL参数传递
- localStorage存储
- 跨iframe通信
- 非JSON环境数据传输
- 需要避免字符转义的场景