求助:将带(-)后缀键的对象转换为分组数组
解决带数字后缀键的对象分组转数组问题
嘿,我明白你要做的事了——把那种带-数字后缀的零散键值对,分组转换成结构清晰的对象数组对吧?这其实不难,我给你两种实现思路和代码,你可以参考下:
方法一:先分组再转数组
这种方法先通过一个临时对象按数字后缀分组,最后把分组结果转成数组,逻辑很直观:
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
相关产品推荐
相关产品推荐

