以下是将数据转换为指定格式并实现双向转换的完整方案:

以下是将数据转换为指定格式并实现双向转换的完整方案:

// 编码函数:对象数组 => 安全字符串
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')); // 输出单元素数组

功能扩展建议

  1. 添加数据校验
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('||');
}
  1. 支持带特殊字符的域名
// 编码时
const encoded = encodeURIComponent(domain);

// 解码时
const decoded = decodeURIComponent(domain);
  1. 添加缓存机制
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;
}

使用场景示例

  1. 存储到 localStorage
// 保存
localStorage.setItem('cdnConfig', encodeDomains(originalData));

// 读取
const restoredData = decodeDomains(localStorage.getItem('cdnConfig') || '');
  1. 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') || '');
  1. 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" />

注意事项

  1. 数据安全性
  • 避免直接使用 eval() 解析
  • 对输入数据进行消毒处理
  • 限制最大权重值(如 1-10)
  1. 性能优化
// 使用 Web Worker 处理大数据
const worker = new Worker('domain-processor.js');
worker.postMessage(encodeDomains(largeData));
  1. 类型约束
// TypeScript 类型定义
interface DomainConfig {
  domain: string;
  weight: number;
}

function encodeDomains(data: DomainConfig[]): string {
  // 实现同上
}

function decodeDomains(str: string): DomainConfig[] {
  // 实现同上
}

该方案可以安全地在以下场景使用:

  • URL参数传递
  • localStorage存储
  • 跨iframe通信
  • 非JSON环境数据传输
  • 需要避免字符转义的场景 以下是将数据转换为指定格式并实现双向转换的完整方案: