如何根据自定义键拆分对象:按S-、FG-、SG-前缀分割为多对象
按自定义键前缀拆分对象为多结构的解决方案
需求说明
需要将包含S-、FG-、SG-前缀键的单个对象,拆分为包含student、firstGuardian、secondGuardian三个子对象的结构,每个子对象对应前缀匹配的键值对。
原始对象
const originalObj = { 'S-First Name': 'Seif ', 'S-Last Name': 'Ali', 'S-Gender': 'Male', 'S-Date Of Birth': new Date('2011-06-24T21:59:51.000Z'), 'S-Nationality': 'Egyptian', 'S-National ID': 21106250100531, 'S-Grade': 'G5', 'S-Class': 'B', 'S-URL Photo': 'mb23thud', 'FG-First Name': 'Ali', 'FG-Last Name': 'Ahmed', 'FG-Relation': 'FATHER', 'FG-Gender': 'Male', 'FG-Date Of Birth': new Date('1981-08-08T20:59:51.000Z'), 'FG-Nationality': 'Egyptian', 'FG-National ID': 28108090100531, 'FG-Email': 'jojo@gmail.com', 'FG-Phone Number': '00201016606666', 'SG-First Name': 'Aya', 'SG-Last Name': 'Adel', 'SG-Relation': 'MOTHER', 'SG-Gender': 'Female', 'SG-Date Of Birth': new Date('1997-10-24T21:59:51.000Z'), 'SG-Nationality': 'Egyptian', 'SG-National ID': 29710250103561, 'SG-Email': 'aya@gmail.com', 'SG-Phone Number': '00201016605555' };
实现代码(JavaScript)
// 定义前缀与目标子对象的映射关系 const prefixMap = { 'S-': 'student', 'FG-': 'firstGuardian', 'SG-': 'secondGuardian' }; // 初始化结果对象 const result = { student: {}, firstGuardian: {}, secondGuardian: {} }; // 遍历原始对象的所有键值对 for (const [key, value] of Object.entries(originalObj)) { // 找到匹配的前缀 const prefix = Object.keys(prefixMap).find(p => key.startsWith(p)); if (prefix) { // 将键值对添加到对应的子对象中 result[prefixMap[prefix]][key] = value; } } console.log(result);
关键说明
- 映射表设计:通过
prefixMap明确前缀和目标子对象的对应关系,后续新增或修改前缀规则时,仅需调整映射表即可,扩展性强。 - 遍历匹配逻辑:用
Object.entries遍历原始对象,通过startsWith判断键的前缀归属,精准将键值对分配到对应子对象。 - 纠正目标结构错误:你提供的目标结构存在两处问题:
first guardian和secound guardian的命名不符合JS标识符规范(改为驼峰式firstGuardian/secondGuardian更合理),且first guardian错误包含SG-First Name键,上述代码会严格按前缀匹配拆分,避免这类失误。
最终输出结构
{ student: { 'S-First Name': 'Seif ', 'S-Last Name': 'Ali', 'S-Gender': 'Male', 'S-Date Of Birth': 2011-06-24T21:59:51.000Z, 'S-Nationality': 'Egyptian', 'S-National ID': 21106250100531, 'S-Grade': 'G5', 'S-Class': 'B', 'S-URL Photo': 'mb23thud' }, firstGuardian: { 'FG-First Name': 'Ali', 'FG-Last Name': 'Ahmed', 'FG-Relation': 'FATHER', 'FG-Gender': 'Male', 'FG-Date Of Birth': 1981-08-08T20:59:51.000Z, 'FG-Nationality': 'Egyptian', 'FG-National ID': 28108090100531, 'FG-Email': 'jojo@gmail.com', 'FG-Phone Number': '00201016606666' }, secondGuardian: { 'SG-First Name': 'Aya', 'SG-Last Name': 'Adel', 'SG-Relation': 'MOTHER', 'SG-Gender': 'Female', 'SG-Date Of Birth': 1997-10-24T21:59:51.000Z, 'SG-Nationality': 'Egyptian', 'SG-National ID': 29710250103561, 'SG-Email': 'aya@gmail.com', 'SG-Phone Number': '00201016605555' } }
内容的提问来源于stack exchange,提问作者ahmed basher
相关产品推荐
相关产品推荐

