讲师中心 微信公众号
AI工具推荐 视频效率加速

将对象数组中包含数组值的属性合并为单个对象

轻宇君_9374

轻宇君_9374

发布时间:2025-11-21 19:27:01

|

1018人浏览过

|

来源于php中文网

原创

将对象数组中包含数组值的属性合并为单个对象

本教程将详细介绍如何使用纯JavaScript将一个包含多个对象的数组转换为单个对象,并在此过程中将所有同名属性下的数组值进行合并(拼接)。我们将利用`Array.prototype.reduce()`和`Object.entries()`方法,通过一个清晰的示例代码和详细解释,帮助您高效地处理此类数据转换需求。

将对象数组中的数组值合并到单个对象

在JavaScript开发中,我们经常会遇到需要对复杂数据结构进行转换的场景。其中一个常见需求是将一个由多个对象组成的数组,转换成一个单一的对象。更具体地,如果这些对象内部包含数组类型的属性,我们希望将所有同名属性的数组值进行拼接,形成一个包含所有相关数据的总集合。

场景描述

假设我们有一个before数组,它包含两个对象,每个对象都有nodes和links两个属性,且这两个属性的值都是数组。我们的目标是将其转换为一个after对象,其中nodes属性包含所有原始nodes数组的元素,links属性包含所有原始links数组的元素。

原始数据示例 (before):

const before = [
  {
    nodes: [
      { "id": "1" },
      { "id": "2" }
    ],
    links: [
      { "source": "1", "target": "2" }
    ],
  },
  {
    nodes: [
        { "id": "3" },
        { "id": "4" },
        { "id": "5" },
        { "id": "6" }
    ],
    links: [
      { "source": "3", "target": "4" },
      { "source": "5", "target": "6" }
    ],
  }
];

期望结果示例 (after):

const after = {
  nodes: [
    { "id": "1" },
    { "id": "2" },
    { "id": "3" },
    { "id": "4" },
    { "id": "5" },
    { "id": "6" }
  ],
  links: [
    { "source": "1", "target": "2" },
    { "source": "3", "target": "4" },
    { "source": "5", "target": "6" }
  ],
};

解决方案:使用 reduce 和 Object.entries

解决此问题的最简洁有效的方法之一是结合使用 Array.prototype.reduce() 和 Object.entries()。

PigX UI 前端开发
PigX UI 前端开发

PigX UI Pro 前端开发指南 - Vue 3 + TypeScript + Element Plus。当用户提到 PigX UI、PigX 前端、lgb-mgui 项目、Vue 3 企业级后台开发、Element Plus 后台开发时使用此技能。

下载
  1. Array.prototype.reduce(): 这个方法对数组中的每个元素执行一个由您提供的“reducer”回调函数,将其结果汇总为单个返回值。在这里,我们将用它来迭代 before 数组中的每个对象,并逐步构建我们的最终结果对象。
  2. Object.entries(): 这个方法返回一个给定对象自身可枚举字符串键属性的[key, value]对的数组。这允许我们方便地遍历 before 数组中每个对象的属性。

详细实现步骤与代码

下面是实现上述数据转换的JavaScript代码:

const before = [
    {
        nodes: [
            { "id": "1" },
            { "id": "2" }
        ],
        links: [
            { "source": "1", "target": "2" }
        ],
    },
    {
        nodes: [
            { "id": "3" },
            { "id": "4" },
            { "id": "5" },
            { "id": "6" }
        ],
        links: [
            { "source": "3", "target": "4" },
            { "source": "5", "target": "6" }
        ],
    }
];

// 使用 reduce 方法进行数据转换
const result = before.reduce((accumulator, currentObject) => {
    // 遍历当前对象的每一个属性(key-value 对)
    Object.entries(currentObject).forEach(([key, value]) => {
        // 将当前属性的值(value)与累加器中对应属性的现有值进行拼接
        // (accumulator[key] ?? []) 用于处理 accumulator[key] 首次出现时为 undefined 的情况
        // ... 用于展开数组,实现拼接
        accumulator[key] = [ ...(accumulator[key] ?? []), ...value];
    });
    // 返回更新后的累加器
    return accumulator;
}, {}); // 初始累加器是一个空对象 {}

console.log(result);
/*
输出:
{
  nodes: [
    { id: '1' }, { id: '2' },
    { id: '3' }, { id: '4' },
    { id: '5' }, { id: '6' }
  ],
  links: [
    { source: '1', target: '2' },
    { source: '3', target: '4' },
    { source: '5', target: '6' }
  ]
}
*/

代码解析

  1. before.reduce((accumulator, currentObject) => { ... }, {});:

    • reduce 方法被调用在 before 数组上。
    • accumulator (acc) 是累加器,它会存储我们最终要生成的结果对象。在第一次迭代时,它的值是 reduce 方法的第二个参数 {}(一个空对象)。
    • currentObject (curr) 是 before 数组中当前正在处理的对象。
    • {} 是 reduce 方法的初始值,表示最终结果将从一个空对象开始构建。
  2. Object.entries(currentObject).forEach(([key, value]) => { ... });:

    • 在 reduce 的每次迭代中,我们对 currentObject 使用 Object.entries()。这会将当前对象的所有可枚举属性转换为一个 [key, value] 对的数组。
    • 然后,我们使用 forEach 遍历这些 [key, value] 对。解构赋值 ([key, value]) 使得我们可以直接访问属性名和属性值。
  3. accumulator[key] = [ ...(accumulator[key] ?? []), ...value];:

    • 这是核心的拼接逻辑。
    • accumulator[key] 尝试访问累加器中与当前 key 对应的属性。
    • accumulator[key] ?? []:这是ES2020引入的空值合并运算符(Nullish Coalescing Operator)。它的作用是,如果 accumulator[key] 是 null 或 undefined(即这是该属性第一次出现在累加器中),则使用 [](一个空数组)作为默认值;否则,使用 accumulator[key] 的现有值。这确保了我们总是在一个数组上进行拼接操作。
    • ... 扩展运算符:用于将数组的元素展开。
      • ...(accumulator[key] ?? []) 将累加器中该 key 下的现有数组(或空数组)的元素展开。
      • ...value 将当前 currentObject 中该 key 下的数组 value 的元素展开。
    • 通过将这两个展开的数组放在一个新数组字面量 [] 中,我们实现了两个数组的拼接,并将结果赋值回 accumulator[key]。

注意事项

  • 数据类型假设:此解决方案假设您希望合并的属性值都是数组。如果某个属性的值不是数组,此方法将尝试将其展开,这可能导致非预期的行为(例如,字符串会被展开成字符数组)。在实际应用中,如果数据类型不确定,您可能需要添加额外的类型检查。
  • 性能:对于大型数据集,reduce 结合 forEach 和数组展开是一种高效且可读性强的方法。
  • Lodash 替代方案:虽然本教程专注于纯 JavaScript,但如果您在项目中使用 Lodash 库,可以使用 _.mergeWith 配合自定义合并函数或 _.reduce 结合 _.assignWith 来实现类似功能,但通常纯 JavaScript 方案在现代浏览器中已足够简洁和高效。

总结

通过巧妙地结合 Array.prototype.reduce() 和 Object.entries(),我们可以优雅地解决将对象数组中包含数组值的属性合并到单个对象的问题。这种模式在处理聚合数据、扁平化结构等场景中非常实用,并且完全基于纯 JavaScript 实现,无需引入额外库,是前端开发中一项重要的技能。

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2411

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

494

2025.10.31

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

422

2026.02.12

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

509

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1658

2024.03.01

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

5764

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2384

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

1592

2025.10.17

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

60

2026.09.23

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 11.9万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 6.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn