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

求助:将带(-)后缀键的对象转换为分组数组

解决带数字后缀键的对象分组转数组问题

嘿,我明白你要做的事了——把那种带-数字后缀的零散键值对,分组转换成结构清晰的对象数组对吧?这其实不难,我给你两种实现思路和代码,你可以参考下:

方法一:先分组再转数组

这种方法先通过一个临时对象按数字后缀分组,最后把分组结果转成数组,逻辑很直观:

const obj = { 
  "name-1":"a", 
  "age-1":"20", 
  "email-1":"a@email.com", 
  "name-2":"b", 
  "age-2":"24", 
  "email-2":"b@email.com", 
  "name-3":"c", 
  "age-3":"22", 
  "email-3":"c@email1.com" 
};

// 创建临时对象存储分组数据
const groupedData = {};

// 遍历原对象的所有键值对
for (const [fullKey, value] of Object.entries(obj)) {
  // 拆分键:用正则匹配末尾的数字前缀,分离出属性名和组编号
  const [propName, groupId] = fullKey.split(/-(?=\d+$)/);
  
  // 如果当前组还未初始化,先创建空对象
  if (!groupedData[groupId]) {
    groupedData[groupId] = {};
  }
  
  // 将属性和值添加到对应组的对象中
  groupedData[groupId][propName] = value;
}

// 把分组对象的值提取出来,就是目标数组
const finalResult = Object.values(groupedData);

console.log(finalResult);

方法二:用reduce直接构建数组

如果你喜欢更简洁的写法,可以用Array.reduce一步到位,直接构建目标数组:

const obj = { 
  "name-1":"a", 
  "age-1":"20", 
  "email-1":"a@email.com", 
  "name-2":"b", 
  "age-2":"24", 
  "email-2":"b@email.com", 
  "name-3":"c", 
  "age-3":"22", 
  "email-3":"c@email1.com" 
};

const finalResult = Object.entries(obj).reduce((resultArr, [fullKey, value]) => {
  const [propName, groupId] = fullKey.split(/-(?=\d+$)/);
  // 把组编号转成数组索引(因为组编号从1开始,数组索引从0开始)
  const arrIndex = parseInt(groupId) - 1;
  
  // 初始化当前索引的对象(如果还没有的话)
  if (!resultArr[arrIndex]) {
    resultArr[arrIndex] = {};
  }
  
  // 添加属性到对应对象
  resultArr[arrIndex][propName] = value;
  return resultArr;
}, []);

console.log(finalResult);

关键细节说明

上面代码里用到的正则/(?=\d+$)/是个小技巧——它是正向预查,只会匹配键末尾紧跟数字的那个-,这样就算你的键里有其他-(比如user-name-1)也能正确拆分,比直接用split('-')更健壮。

两种方法最终都会输出你想要的结果:

[ 
  { "name":"a", "age":"20", "email":"a@email.com" }, 
  { "name":"b", "age":"24", "email":"b@email.com" }, 
  { "name":"c", "age":"22", "email":"c@email1.com" } 
]

内容的提问来源于stack exchange,提问作者Jaison James

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 08:37:42