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

如何优化数组转多键对象代码以实现分层分组输出?

优化数组转换函数以生成分层结构输出

我无法优化现有数组转换函数来得到期望的分层输出,现有代码如下:

const students = [
  ['Name01', 'Sub01', 'y', 'Sub02', 'y', 'Sub03', 'y', 'Sub04', 'y', 'OverAll', 'y', 'SecA'],
  ['Name02', 'Sub01', 'n', 'Sub02', 'y', 'Sub03', 'y', 'Sub04', 'y', 'OverAll', 'n', 'SecA'],
  ['Name03', 'Sub01', 'y', 'Sub02', 'y', 'Sub03', 'n', 'Sub04', 'y', 'OverAll', 'n', 'SecB'],
  ['Name04', 'Sub01', 'y', 'Sub02', 'y', 'Sub03', 'y', 'Sub04', 'y', 'OverAll', 'y', 'SecB'],
  ['Name05', 'Sub01', 'y', 'Sub02', 'y', 'Sub03', 'y', 'Sub04', 'n', 'OverAll', 'n', 'SecB']];

const newArr = students.reduce((a, [A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, Sec]) => {
  a[A1] = { Name: A1, Sub01: A3, Sub02: A5, Sub03: A3, Sub04: A7, Sub05: A9, OverAll: A11, Sec }
  return a;
}, {});

console.log(newArr)

当前代码输出结果:

{
  Name01: {
    Name: 'Name01', Sub01: 'y', Sub02: 'y', Sub03: 'y', Sub04: 'y', Sub05: 'y', OverAll: 'y', Sec: 'SecA'
  },
  Name02: {
    Name: 'Name02', Sub01: 'n', Sub02: 'y', Sub03: 'n', Sub04: 'y', Sub05: 'y', OverAll: 'n', Sec: 'SecA'
  },
  Name03: {
    Name: 'Name03', Sub01: 'y', Sub02: 'y', Sub03: 'y', Sub04: 'n', Sub05: 'y', OverAll: 'n', Sec: 'SecB'
  },
  Name04: {
    Name: 'Name04', Sub01: 'y', Sub02: 'y', Sub03: 'y', Sub04: 'y', Sub05: 'y', OverAll: 'y', Sec: 'SecB'
  },
  Name05: {
    Name: 'Name05', Sub01: 'y', Sub02: 'y', Sub03: 'y', Sub04: 'y', Sub05: 'n', OverAll: 'n', Sec: 'SecB'
  }
}

期望输出结构:

{
  Pass: {
    SecA: {
      Name01: { Name: 'Name01', Sub01: 'y', Sub02: 'y', Sub03: 'y', Sub04: 'y', Sub05: 'y' }
    },
    SecB: {
      Name04: { Name: 'Name04', Sub01: 'y', Sub02: 'y', Sub03: 'y', Sub04: 'y', Sub05: 'y' }
    }
  },
  Fail: {
    SecA: {
      Name02: { Name: 'Name02', Sub01: 'n', Sub02: 'y', Sub03: 'n', Sub04: 'y', Sub05: 'y' }
    },
    SecB: {
      Name03: { Name: 'Name03', Sub01: 'y', Sub02: 'y', Sub03: 'y', Sub04: 'n', Sub05: 'y' },
      Name05: { Name: 'Name05', Sub01: 'y', Sub02: 'y', Sub03: 'y', Sub04: 'y', Sub05: 'n' }
    }
  }
}

优化后的代码

const students = [
  ['Name01', 'Sub01', 'y', 'Sub02', 'y', 'Sub03', 'y', 'Sub04', 'y', 'OverAll', 'y', 'SecA'],
  ['Name02', 'Sub01', 'n', 'Sub02', 'y', 'Sub03', 'y', 'Sub04', 'y', 'OverAll', 'n', 'SecA'],
  ['Name03', 'Sub01', 'y', 'Sub02', 'y', 'Sub03', 'n', 'Sub04', 'y', 'OverAll', 'n', 'SecB'],
  ['Name04', 'Sub01', 'y', 'Sub02', 'y', 'Sub03', 'y', 'Sub04', 'y', 'OverAll', 'y', 'SecB'],
  ['Name05', 'Sub01', 'y', 'Sub02', 'y', 'Sub03', 'y', 'Sub04', 'n', 'OverAll', 'n', 'SecB']];

const result = students.reduce((acc, [name, _, sub01, _, sub02, _, sub03, _, sub04, _, overAll, sec]) => {
  // 根据OverAll结果确定分组
  const group = overAll === 'y' ? 'Pass' : 'Fail';
  
  // 确保班级层级结构存在,不存在则初始化空对象
  if (!acc[group][sec]) {
    acc[group][sec] = {};
  }
  
  // 构建学生成绩对象,修正原代码的科目值映射错误
  acc[group][sec][name] = {
    Name: name,
    Sub01: sub01,
    Sub02: sub02,
    Sub03: sub03,
    Sub04: sub04,
    Sub05: sub04 // 保持原代码的Sub05逻辑,若需调整可修改对应索引
  };
  
  return acc;
}, { Pass: {}, Fail: {} }); // 初始值直接创建Pass和Fail的空结构

console.log(result);

代码说明

  1. 分层存储逻辑:先按OverAll结果将学生归入Pass或Fail组,再按班级Sec分类,最后以学生姓名为键存储成绩信息。
  2. 修正数据映射错误:原代码中Sub03错误复用了Sub01的值,现在按数组索引正确提取每个科目的结果。
  3. 层级初始化:提前初始化Pass和Fail的空结构,仅在班级不存在时创建新的班级对象,简化判断逻辑。
  4. 简化解构:用下划线_作为占位符,跳过数组中不需要的科目名称字符串,让代码更简洁易读。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 16:55:28