如何优化数组转多键对象代码以实现分层分组输出?
优化数组转换函数以生成分层结构输出
我无法优化现有数组转换函数来得到期望的分层输出,现有代码如下:
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);
代码说明
- 分层存储逻辑:先按
OverAll结果将学生归入Pass或Fail组,再按班级Sec分类,最后以学生姓名为键存储成绩信息。 - 修正数据映射错误:原代码中
Sub03错误复用了Sub01的值,现在按数组索引正确提取每个科目的结果。 - 层级初始化:提前初始化
Pass和Fail的空结构,仅在班级不存在时创建新的班级对象,简化判断逻辑。 - 简化解构:用下划线
_作为占位符,跳过数组中不需要的科目名称字符串,让代码更简洁易读。
内容的提问来源于stack exchange,提问作者Tutor ClassD
相关产品推荐
相关产品推荐

