如何在JavaScript中将ISO3国家代码转换为ISO2国家代码?
ISO3国家代码转ISO2的JavaScript实现方案
直接用Intl.Locale确实没法完成这个转换,因为它的region属性只认ISO2格式的代码,没法直接通过ISO3反向导出对应的ISO2。下面给两个可行的解决方法:
方法一:手动维护映射表(最稳妥)
直接定义一个包含ISO3与ISO2对应关系的对象,这种方式不依赖浏览器的API支持,兼容性拉满,结果也绝对准确。
// 示例包含常用国家的映射,你可以根据需求补充完整的ISO3166-1代码列表 const iso3ToIso2Map = { 'USA': 'US', 'CHN': 'CN', 'GBR': 'GB', 'JPN': 'JP', 'DEU': 'DE', 'FRA': 'FR', 'AFG': 'AF', 'ALB': 'AL', 'DZA': 'DZ' }; function convertIso3ToIso2(iso3Code) { // 统一转大写,避免大小写不匹配的问题 const upperCode = iso3Code.toUpperCase(); // 有匹配就返回ISO2代码,没有就返回null return iso3ToIso2Map[upperCode] || null; } // 测试示例 console.log(convertIso3ToIso2('USA')); // 输出 'US' console.log(convertIso3ToIso2('chn')); // 输出 'CN' console.log(convertIso3ToIso2('XXX')); // 输出 null
完整的ISO3166-1代码列表可以从国际标准化组织的公开文档里整理,这样能覆盖所有国家和地区。
方法二:基于Intl API自动生成映射表(适合不想手动维护的场景)
如果不想手动整理列表,可以借助浏览器的Intl API自动生成映射,但要注意部分老旧浏览器可能不支持Intl.supportedValuesOf方法。
function buildIso3ToIso2Map() { const iso3ToIso2 = {}; // 获取所有支持的ISO2区域代码 const iso2Regions = Intl.supportedValuesOf('region'); iso2Regions.forEach(iso2 => { try { // 创建对应区域的Locale对象 const locale = new Intl.Locale(`en-${iso2}`); // 通过扩展标签获取ISO3代码 const regionExtension = locale.extensions.get('u')?.get('rg'); if (regionExtension) { const iso3 = regionExtension.value; iso3ToIso2[iso3.toUpperCase()] = iso2; } } catch (e) { // 跳过不支持的区域 return; } }); return iso3ToIso2; } // 生成映射表后使用 const fullMap = buildIso3ToIso2Map(); console.log(fullMap['USA']); // 输出 'US'
不过这个方法的兼容性不如手动维护,而且部分浏览器可能无法正确返回ISO3扩展信息,所以还是更推荐第一种方法。
内容的提问来源于stack exchange,提问作者Davi
相关产品推荐
相关产品推荐

