0

0

将数组中分散的键值对象按逻辑分组合并为结构化对象

霞舞

霞舞

发布时间:2026-03-03 17:23:02

|

964人浏览过

|

来源于php中文网

原创

将数组中分散的键值对象按逻辑分组合并为结构化对象

本文介绍如何将一组按字段分散存储的对象数组(如 company、block、start_date、end_date 各占一个对象),依据字段语义规律,高效合并为多个完整业务对象,适用于日程、预约、资源分配等场景。

本文介绍如何将一组按字段分散存储的对象数组(如 company、block、start_date、end_date 各占一个对象),依据字段语义规律,高效合并为多个完整业务对象,适用于日程、预约、资源分配等场景。

在实际开发中,我们常遇到后端返回的扁平化、非结构化数据:同一业务实体(如一条日程记录)的多个字段被拆分成独立对象,依次排列在数组中。例如,company、block、start_date、end_date 各自占据一个对象,且每组四字段循环出现。目标是将它们按顺序“聚合成”结构清晰的完整对象。

核心思路是:识别每组数据的起始标识字段(如 "company"),以此作为新对象的创建信号;后续同组字段则累加到当前对象中。

以下是一个健壮、可读性强的实现方案:

创客贴设计
创客贴设计

创客贴设计,一款智能在线设计工具,设计不求人,AI助你零基础完成专业设计!

下载
function groupByFirstKey(arr) {
  if (!Array.isArray(arr) || arr.length === 0) return [];

  // 取第一个对象的首个键名(假设每组均以该键开头)
  const [startKey] = Object.keys(arr[0]);

  const result = [];
  let currentObj = null;

  for (const item of arr) {
    const entries = Object.entries(item);
    if (entries.length === 0) continue; // 跳过空对象

    const [key, value] = entries[0]; // 假设每个对象仅含一个键值对

    if (key === startKey) {
      // 遇到新组起点,创建新对象并推入结果
      currentObj = { [key]: value };
      result.push(currentObj);
    } else if (currentObj !== null) {
      // 累加到当前对象(确保不覆盖已有同名字段)
      currentObj[key] = value;
    }
  }

  return result;
}

// 示例数据
const input = [
  { "company": "test" },
  { "block": "test" },
  { "start_date": "15/08/2023 15:00" },
  { "end_date": "15/08/2023 15:00" },
  { "company": "test1" },
  { "block": "test1" },
  { "start_date": "15/08/2023 15:00" },
  { "end_date": "15/08/2023 15:00" }
];

console.log(groupByFirstKey(input));
// 输出:
// [
//   { company: "test", block: "test", start_date: "15/08/2023 15:00", end_date: "15/08/2023 15:00" },
//   { company: "test1", block: "test1", start_date: "15/08/2023 15:00", end_date: "15/08/2023 15:00" }
// ]

关键优势说明:

  • 无需硬编码字段名:自动提取首个对象的首键(如 "company")作为分组锚点,提升通用性;
  • 健壮容错:跳过空对象,避免 Object.entries() 报错;
  • 语义清晰:变量命名(startKey, currentObj)直指逻辑意图,便于团队维护;
  • 可扩展性强:若后续字段增加(如 "location"),只要保持相同分组顺序,代码无需修改。

⚠️ 注意事项:

  • 本方案依赖字段顺序与分组规律(即每组以 startKey 开头,其余字段严格按序跟随)。若数据无序或存在缺失字段,需先校验或预处理;
  • 若存在多层级嵌套或动态字段组合,建议改用更声明式的方案(如 reduce + 状态机),或前置 Schema 定义;
  • 生产环境建议添加类型检查(如使用 TypeScript)或输入校验(如 arr.every(item => typeof item === 'object' && Object.keys(item).length === 1))。

总结而言,该方法以最小认知成本实现了结构重组,在保证简洁性的同时兼顾可读性与鲁棒性,是处理此类「扁平化业务数据聚合」问题的推荐实践。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

43

2026.02.13

TypeScript全栈项目架构与接口规范设计
TypeScript全栈项目架构与接口规范设计

本专题面向全栈开发者,系统讲解基于 TypeScript 构建前后端统一技术栈的工程化实践。内容涵盖项目分层设计、接口协议规范、类型共享机制、错误码体系设计、接口自动化生成与文档维护方案。通过完整项目示例,帮助开发者构建结构清晰、类型安全、易维护的现代全栈应用架构。

136

2026.02.25

length函数用法
length函数用法

length函数用于返回指定字符串的字符数或字节数。可以用于计算字符串的长度,以便在查询和处理字符串数据时进行操作和判断。 需要注意的是length函数计算的是字符串的字符数,而不是字节数。对于多字节字符集,一个字符可能由多个字节组成。因此,length函数在计算字符串长度时会将多字节字符作为一个字符来计算。更多关于length函数的用法,大家可以阅读本专题下面的文章。

952

2023.09.19

JavaScript中的typeof用法
JavaScript中的typeof用法

在JavaScript中,typeof是一个用来确定给定变量的数据类型的操作符。可以用来确定一个变量是字符串、数字、布尔值、函数、对象或undefined的数据类型。更多关于typeof用法相关文章,详情请看本专题下面的文章,php中文网欢迎大家前来学习。

769

2023.11.23

location.assign
location.assign

在前端开发中,我们经常需要使用JavaScript来控制页面的跳转和数据的传递。location.assign就是JavaScript中常用的一个跳转方法。通过location.assign,我们可以在当前窗口或者iframe中加载一个新的URL地址,并且可以保存旧页面的历史记录。php中文网为大家带来了location.assign的相关知识、以及相关文章等内容,供大家免费下载使用。

232

2023.06.27

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

2

2026.03.03

C++高性能网络编程与Reactor模型实践
C++高性能网络编程与Reactor模型实践

本专题围绕 C++ 在高性能网络服务开发中的应用展开,深入讲解 Socket 编程、多路复用机制、Reactor 模型设计原理以及线程池协作策略。内容涵盖 epoll 实现机制、内存管理优化、连接管理策略与高并发场景下的性能调优方法。通过构建高并发网络服务器实战案例,帮助开发者掌握 C++ 在底层系统与网络通信领域的核心技术。

7

2026.03.03

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

68

2026.02.28

Golang 工程化架构设计:可维护与可演进系统构建
Golang 工程化架构设计:可维护与可演进系统构建

Go语言工程化架构设计专注于构建高可维护性、可演进的企业级系统。本专题深入探讨Go项目的目录结构设计、模块划分、依赖管理等核心架构原则,涵盖微服务架构、领域驱动设计(DDD)在Go中的实践应用。通过实战案例解析接口抽象、错误处理、配置管理、日志监控等关键工程化技术,帮助开发者掌握构建稳定、可扩展Go应用的最佳实践方法。

59

2026.02.28

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MongoDB 教程
MongoDB 教程

共17课时 | 3.1万人学习

微信小程序开发之API篇
微信小程序开发之API篇

共15课时 | 1.3万人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.4万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号