如何在 Node.js 中按公共字段合并多个数组中的数据

聖光之護

聖光之護

2026-01-12

343人浏览

原创

如何在 Node.js 中按公共字段合并多个数组中的数据

本文介绍如何将嵌套的二维用户数据数组,按 `class_id` 字段归并为统一结构:每个班级对应一个对象,其 `students` 数组包含该班所有学生(仅保留 `roll_number` 和 `name`)。核心方法是先扁平化再用 `reduce` 构建哈希映射,最后提取值。

在 Node.js(或现代浏览器环境)中处理多维嵌套数据时,直接使用 map 或 for 循环逐层遍历容易遗漏跨子数组的同字段聚合逻辑——正如提问中所示:原始数据是二维数组(每个子数组可能含多个不同 class_id 的学生),而需求是按 class_id 全局分组,而非按子数组顺序分组。

✅ 正确思路:扁平化 + 累积映射 + 提取值

  1. flat() 扁平化:将二维数组转为一维,消除嵌套层级干扰;
  2. reduce() 构建索引对象:以 class_id 为键,动态初始化班级对象 { class_id, students: [] };
  3. Object.values() 提取结果:将键值对映射转为符合要求的数组格式。

以下是完整、可直接运行的解决方案:

Comet AI 浏览器
Comet AI 浏览器

下载 Comet AI 浏览器,体验由 Perplexity AI 驱动的革命性上网方式。内置 AI 助手可实时总结网页、跨标签页对比信息、自动执行任务。告别繁琐操作,让 AI 成为你的浏览副驾,大幅提升研究与工作效率。支持 Windows、macOS、Android 和 iOS。

下载
const data = [
  [
    { class_id: "Grade 1", roll_number: "1", name: "alex" },
    { class_id: "Grade 1", roll_number: "2", name: "bob" },
  ],
  [
    { class_id: "Grade 2", roll_number: "7", name: "peter" },
    { class_id: "Grade 3", roll_number: "6", name: "lia" },
    { class_id: "Grade 2", roll_number: "5", name: "mary" },
    { class_id: "Grade 3", roll_number: "1", name: "violet" },
  ],
];

const result = data
  .flat() // → [{...}, {...}, {...}, ...]
  .reduce((acc, { class_id, roll_number, name }) => {
    // 若该 class_id 尚未存在,则初始化
    acc[class_id] ??= { class_id, students: [] };
    // 向对应班级的 students 数组推入精简学生对象
    acc[class_id].students.push({ roll_number, name });
    return acc;
  }, {});

console.log(Object.values(result));
// 输出:
// [
//   { class_id: "Grade 1", students: [{ roll_number: "1", name: "alex" }, { roll_number: "2", name: "bob" }] },
//   { class_id: "Grade 2", students: [{ roll_number: "7", name: "peter" }, { roll_number: "5", name: "mary" }] },
//   { class_id: "Grade 3", students: [{ roll_number: "6", name: "lia" }, { roll_number: "1", name: "violet" }] }
// ]

⚠️ 注意事项

  • 兼容性:Array.prototype.flat() 和 ??=(Nullish Coalescing Assignment)需 Node.js ≥ 12(推荐 ≥ 14.17+)或现代浏览器支持。若需兼容旧环境,可用 [].concat(...data) 替代 flat(),用 acc[class_id] = acc[class_id] || { class_id, students: [] } 替代 ??=。
  • 字段健壮性:代码假设每条记录必含 class_id、roll_number、name。生产环境中建议增加校验(如 if (!class_id) continue;)。
  • 性能:该方案时间复杂度为 O(n),空间复杂度为 O(k),其中 n 是总学生数,k 是唯一班级数,高效且易于维护。

此模式不仅适用于学籍管理,也广泛用于日志聚合、订单分组、API 多请求结果合并等场景——关键在于用对象作临时索引容器,避免手动维护索引位置或重复查找

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

2023.08.22

1020

3

java break和continue
java break和continue

本专题整合了java break和continue的区别相关内容,阅读专题下面的文章了解更多详细内容。

2025.10.24

403

6

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

2025.09.05

130

5

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

2025.11.16

223

7

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

2025.11.17

350

20

java判断map相关教程
java判断map相关教程

本专题整合了java判断map相关教程,阅读专题下面的文章了解更多详细内容。

2025.11.27

139

6

js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

2023.06.20

1859

8

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.28

911

5

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.03

1154

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 18.8万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 4.3万人学习