合并对象中含相同数字后缀的键值对,返回对象数组
合并对象中带相同数字后缀的键值对
我需要将对象里带有相同数字后缀的键值对合并为单个对象。例如,alfa0: 'theValueOfAlfa'和beta0: 'theValueOfBeta'这类共享数字后缀0的键,要合并成如下结构:
{ name: 'theValueOfAlfa', value: 'theValueOfBeta' }
给定源对象:
const vls = {"lote0": "jg", "lote1": "h", "lote2": "fm", "loteQnt0": "jgvalue", "loteQnt1": "hvalue", "loteQnt2": "fmvalue" }
期望输出为包含合并后对象的数组:
const result = [ { name: 'jg', value: 'jgvalue' }, { name: 'h', value: 'hvalue' }, { name: 'fm', value: 'fmvalue' } ]
解决方案
针对固定前缀的实现
如果明确lote开头的键对应name字段,loteQnt开头的对应value字段,可以用以下代码:
const vls = {"lote0": "jg", "lote1": "h", "lote2": "fm", "loteQnt0": "jgvalue", "loteQnt1": "hvalue", "loteQnt2": "fmvalue" }; const groups = {}; // 遍历对象的所有键 Object.keys(vls).forEach(key => { // 提取键末尾的数字后缀 const suffixMatch = key.match(/(\d+)$/); if (suffixMatch) { const suffix = suffixMatch[1]; // 初始化分组对象(如果不存在) groups[suffix] = groups[suffix] || {}; // 根据键前缀分配对应字段 if (key.startsWith('lote') && !key.startsWith('loteQnt')) { groups[suffix].name = vls[key]; } else if (key.startsWith('loteQnt')) { groups[suffix].value = vls[key]; } } }); // 将分组对象转换为数组 const result = Object.values(groups); console.log(result);
更通用的实现(适配不同前缀)
如果需要适配更多前缀类型,只需调整字段分配的判断逻辑即可:
const vls = {"lote0": "jg", "lote1": "h", "lote2": "fm", "loteQnt0": "jgvalue", "loteQnt1": "hvalue", "loteQnt2": "fmvalue" }; const groups = {}; // 遍历键值对 Object.entries(vls).forEach(([key, value]) => { const suffix = key.match(/\d+$/)[0]; // 初始化分组 if (!groups[suffix]) groups[suffix] = {}; // 根据键的特征分配字段,可按需修改 if (key.includes('Qnt')) { groups[suffix].value = value; } else { groups[suffix].name = value; } }); const result = Object.values(groups);
内容的提问来源于stack exchange,提问作者Nilton Schumacher F
相关产品推荐
相关产品推荐

