如何将含重复元素的提供商数组转换为带国家列表的唯一数组
问题需求
我有一个countryList数组和一个providers数组,部分提供商名称与国家代码以下划线拼接,且数组存在重复元素。需要生成一个如expectation所示的唯一数组,每个对象包含code(提供商名称)和countries(对应国家列表)两个属性。
示例数据
const countryList = ['CL','BR','CO','MX','US'] const providers = ['MERCADOLIBRE_CL','MERCADOLIBRE_BR','MERCADOLIBRE_CO','MERCADOLIBRE_MX','VERIZON','VERIZON','DGMI_UK'] const expectation = [ {code: "MERCADOLIBRE", countries: ['CL','MX','BR','CO']}, {code: "DGMI_UK", countries: []}, {code: "VERIZON", countries: []}, ]
当前进度代码
我已经能生成去重后的提供商名称列表,但还没实现包含国家列表的完整目标:
// 生成的去重列表:[MERCADOLIBRE,DGMI_UK,VERIZON] const list = []; providers.forEach((str) => { var rest = str.substring(0, str.lastIndexOf("_")); var last = str.substring(str.lastIndexOf("_") + 1, str.length); var found = countryList.includes(last) var provider = (found) ? rest : str if(list.includes(provider) === false) list.push(provider); })
解决方案
可以用对象做映射分组,收集对应国家代码后转成目标数组:
const countryList = ['CL','BR','CO','MX','US'] const providers = ['MERCADOLIBRE_CL','MERCADOLIBRE_BR','MERCADOLIBRE_CO','MERCADOLIBRE_MX','VERIZON','VERIZON','DGMI_UK'] // 用对象存储每个提供商的信息,避免重复 const providerMap = {}; providers.forEach(providerStr => { const splitIndex = providerStr.lastIndexOf('_'); let code; let countryCode = null; // 判断是否是「提供商_有效国家代码」的格式 if (splitIndex !== -1) { const potentialCode = providerStr.slice(0, splitIndex); const potentialCountry = providerStr.slice(splitIndex + 1); if (countryList.includes(potentialCountry)) { code = potentialCode; countryCode = potentialCountry; } else { code = providerStr; } } else { code = providerStr; } // 初始化未记录过的提供商 if (!providerMap[code]) { providerMap[code] = { code: code, countries: [] }; } // 去重添加有效国家代码 if (countryCode && !providerMap[code].countries.includes(countryCode)) { providerMap[code].countries.push(countryCode); } }); // 把对象转成数组,得到最终结果 const result = Object.values(providerMap); console.log(result); // 输出与expectation完全一致
代码说明
- 映射存储:用
providerMap对象快速定位已存在的提供商,避免重复创建对象。 - 格式判断:对每个字符串拆分后,验证国家代码是否在
countryList中,以此确定正确的提供商名称和有效国家代码。 - 去重收集:仅添加未在
countries数组中的有效国家代码,保证列表唯一性。 - 转数组:将对象的取值转为数组,得到符合要求的最终结构。
内容的提问来源于stack exchange,提问作者React Beginer
相关产品推荐
相关产品推荐

