如何将含重复属性的JavaScript数组转换为嵌套对象?
如何将含重复公共属性的数组转换为嵌套对象结构?
现有一组数组,其中每个元素都包含重复的Date、Course、Examiner属性,需要将这些公共属性提取到外层,把每个元素的参与者及评分详情放到嵌套的Details数组中,转换为指定的对象结构。
原数组代码
const data = [ { "Date":"3/24/23", "Course":"BASIC ENGLISH", "Examiner":"Juan Ponce", "Participants":"Nardo Putik", "Examiner Approach":"3", "Clear explanation of topics discussed":"3", "Well organized activity from start to finish":"3" }, { "Date":"3/24/23", "Course":"BASIC ENGLISH", "Examiner":"Juan Ponce", "Participants":"Cardo Martinez", "Examiner Approach":"3", "Clear explanation of topics discussed":"3", "Well organized activity from start to finish":"3" }, { "Date":"3/24/23", "Course":"BASIC ENGLISH", "Examiner":"Juan Ponce", "Participants":"Ippo Kazuya", "Examiner Approach":"3", "Clear explanation of topics discussed":"3", "Well organized activity from start to finish":"3" } ]
期望输出结构
const data = { "Date" : "3/24/23", "Course" : "BASIC ENGLISH", "Examiner" : "Juan Ponce", "Details" : [{ "Participants" : "Ippo Kazuya", "Examiner Approach" : "3", "Clear explanation of topics discussed" : "3", "Well organized activity from start to finish" : "3" }, { "Participants" : "Cardo Martinez", "Examiner Approach" : "3", "Clear explanation of topics discussed" : "3", "Well organized activity from start to finish" : "3" }, { "Participants" : "Nardo Putik", "Examiner Approach": "3", "Clear explanation of topics discussed" : "3", "Well organized activity from start to finish" : "3" }] }
实现方案
这个转换完全可行,以下是两种实用实现方式:
基础实现(默认公共属性一致)
利用对象解构和数组map方法快速提取并重组结构:
const transformData = () => { if (data.length === 0) return {}; // 从第一个元素提取公共属性 const { Date, Course, Examiner } = data[0]; // 遍历数组,收集每个元素的详情部分 const Details = data.map(item => { // 剔除公共属性,保留剩余字段 const { Date: _, Course: __, Examiner: ___, ...details } = item; return details; }); return { Date, Course, Examiner, Details }; }; const result = transformData(); console.log(result);
带验证的实现(确保公共属性一致)
如果需要规避数据不一致的风险,可以添加验证逻辑,确保所有元素的公共属性完全统一:
const transformData = () => { if (data.length === 0) return {}; const { Date, Course, Examiner } = data[0]; // 检查所有元素的公共属性是否与第一个元素一致 const isAllConsistent = data.every(item => item.Date === Date && item.Course === Course && item.Examiner === Examiner ); if (!isAllConsistent) { throw new Error("数组中存在公共属性不一致的元素,无法完成转换"); } const Details = data.map(item => { const { Date: _, Course: __, Examiner: ___, ...details } = item; return details; }); return { Date, Course, Examiner, Details }; }; try { const result = transformData(); console.log(result); } catch (err) { console.error(err.message); }
代码说明
- 解构赋值:通过对象解构快速分离公共属性和详情字段,简化代码逻辑。
- 数组map方法:遍历原数组,为每个元素生成仅包含详情的对象,组成
Details数组。 - 一致性验证(可选):使用
every方法检查所有元素的公共属性是否统一,避免生成不符合预期的结构。
内容的提问来源于stack exchange,提问作者Strywyr
相关产品推荐
相关产品推荐

