如何用TypeScript/JavaScript将对象数组转换为指定结构数组?
解决方案:将嵌套教育数据转换为扁平对象结构
针对你需要把包含嵌套edu数组的用户数据,转换为以学位为键、毕业年份为值的扁平对象数组的需求,这里有一个直观的实现方式,同时还处理了学位名称大小写不一致的问题(比如原数据里的UnderGrad和Undergrad):
完整代码示例(TypeScript)
const originalData = [ { "name": "Alex", "edu": [ { "degree": "Grad", "year": 2007 }, { "degree": "Undergrad", "year": 2005 } ] }, { "name": "Ali", "edu": [ { "degree": "Grad", "year": 2010 }, { "degree": "UnderGrad", "year": 2008 } ] }, { "name": "Nik", "edu": [ { "degree": "Grad", "year": 2009 }, { "degree": "UnderGrad", "year": 2007 } ] } ]; const transformedData = originalData.map(person => { // 把edu数组转换为键值对对象,统一学位名称的大小写格式 const eduFlatObj = person.edu.reduce((accumulator, currentEdu) => { // 标准化键名:首字母大写,其余字母小写 const standardizedDegree = currentEdu.degree.charAt(0).toUpperCase() + currentEdu.degree.slice(1).toLowerCase(); accumulator[standardizedDegree] = currentEdu.year; return accumulator; }, {} as Record<string, number>); // 合并姓名和扁平后的教育数据 return { name: person.name, ...eduFlatObj }; }); console.log(transformedData);
代码解释
- 遍历用户数组:用
Array.map()逐个处理每个用户对象,返回转换后的新对象。 - 扁平化教育数组:用
Array.reduce()将每个用户的edu数组转换成{ 学位: 年份 }的键值对对象。这里额外做了键名标准化,避免因大小写差异出现重复或不一致的键(比如原数据中的UnderGrad和Undergrad会被统一为Undergrad)。 - 合并对象:用扩展运算符
...把用户姓名和扁平化后的教育数据合并成最终的扁平对象。
简化版(不处理大小写)
如果你的数据源中学位名称的大小写完全一致,也可以去掉标准化步骤,直接使用原始学位名称作为键:
// JavaScript简化版 const transformedData = originalData.map(person => ({ name: person.name, ...person.edu.reduce((acc, curr) => { acc[curr.degree] = curr.year; return acc; }, {}) }));
TypeScript类型定义(可选)
如果需要严格的类型约束,可以提前定义接口:
interface OriginalUser { name: string; edu: Array<{ degree: string; year: number; }>; } interface TransformedUser { name: string; Grad: number; Undergrad: number; } const transformedData: TransformedUser[] = originalData.map(...);
内容的提问来源于stack exchange,提问作者nik2233
相关产品推荐
相关产品推荐

