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

如何将含重复属性的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);
}

代码说明

  1. 解构赋值:通过对象解构快速分离公共属性和详情字段,简化代码逻辑。
  2. 数组map方法:遍历原数组,为每个元素生成仅包含详情的对象,组成Details数组。
  3. 一致性验证(可选):使用every方法检查所有元素的公共属性是否统一,避免生成不符合预期的结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 13:05:39