You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将含重复元素的提供商数组转换为带国家列表的唯一数组

问题需求

我有一个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完全一致

代码说明

  1. 映射存储:用providerMap对象快速定位已存在的提供商,避免重复创建对象。
  2. 格式判断:对每个字符串拆分后,验证国家代码是否在countryList中,以此确定正确的提供商名称和有效国家代码。
  3. 去重收集:仅添加未在countries数组中的有效国家代码,保证列表唯一性。
  4. 转数组:将对象的取值转为数组,得到符合要求的最终结构。

内容的提问来源于stack exchange,提问作者React Beginer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 16:13:23