0

0

JavaScript 中按日期键合并文件与文件夹对象的优雅实现

霞舞

霞舞

发布时间:2026-03-15 17:04:03

|

217人浏览过

|

来源于php中文网

原创

JavaScript 中按日期键合并文件与文件夹对象的优雅实现

本文介绍如何将具有相同日期属性(如 "2023-06-05")的文件数组和文件夹数组,高效、可读地合并为统一的嵌套结构,避免冗余循环与空值判断,提供函数式、健壮且易于维护的解决方案。

本文介绍如何将具有相同日期属性(如 "2023-06-05")的文件数组和文件夹数组,高效、可读地合并为统一的嵌套结构,避免冗余循环与空值判断,提供函数式、健壮且易于维护的解决方案。

在构建文件管理类应用(如网盘或资源浏览器)时,常需将服务端返回的 files 和 folders 两类数据,按其 created_at 字段(格式为 YYYY-MM-DD)归并到同一时间维度下。目标结构如下:

recent: {
  "2023-05-06": {
    files: [...],
    folders: [...]
  },
  "2023-05-07": {
    files: [...],
    folders: [...]
  }
}

原始实现存在明显缺陷:手动创建多个中间对象(temp_files/temp_folders/files/folders)、重复 reduce 逻辑、使用 null 占位导致类型不安全,且 Object.keys(temp_files, temp_folders) 实际仅取第一个参数——语法无效。

✅ 推荐解法:单次遍历 + Map 驱动聚合 + 解构合并,兼顾性能、可读性与健壮性:

created() {
  axios.get('/api/file/recent').then(r => {
    // 步骤1:统一提取所有日期键,并去重
    const allItems = [...r.data.files, ...r.data.folders];
    const dateKeys = [...new Set(allItems.map(item => item.created_at))];

    // 步骤2:用 Map 按日期预分组(避免重复查找)
    const filesByDate = new Map();
    const foldersByDate = new Map();

    r.data.files.forEach(file => {
      const date = file.created_at;
      filesByDate.set(date, [...(filesByDate.get(date) || []), file]);
    });

    r.data.folders.forEach(folder => {
      const date = folder.created_at;
      foldersByDate.set(date, [...(foldersByDate.get(date) || []), folder]);
    });

    // 步骤3:生成最终 recent 对象(函数式、无副作用)
    const recent = Object.fromEntries(
      dateKeys.map(date => [
        date,
        {
          files: filesByDate.get(date) || [],
          folders: foldersByDate.get(date) || []
        }
      ])
    );

    this.recent = recent; // 假设 Vue 实例中绑定 data 属性
  });
}

? 关键优化点说明:

小羊标书
小羊标书

一键生成百页标书,让投标更简单高效

下载

立即学习Java免费学习笔记(深入)”;

  • 避免多次 reduce:原方案对 files 和 folders 各执行一次 reduce,而本方案通过 Map 实现 O(1) 插入与查询,时间复杂度仍为 O(n),但常数更小;
  • 类型安全:files 与 folders 均默认为空数组([]),而非 null,下游消费无需额外判空;
  • 语义清晰:Object.fromEntries() + map() 明确表达“将日期映射为 {files, folders} 对象”的意图;
  • 可扩展性强:若后续新增 links 或 archives 类型,只需追加对应 forEach 分组逻辑,主体结构不变。

? 进阶建议(TypeScript 用户):
可定义类型提升安全性:

interface FileItem { created_at: string; name: string; /* ... */ }
interface FolderItem { created_at: string; title: string; /* ... */ }

type RecentRecord = {
  files: FileItem[];
  folders: FolderItem[];
};
type RecentMap = Record<string, RecentRecord>;

总结:合并同键对象不应依赖“拼凑式”多层嵌套赋值。以日期为枢纽,用 Map 聚合 + Object.fromEntries() 组装,是兼顾性能、可读性与工程健壮性的现代 JavaScript 实践。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

49

2026.02.13

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

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

197

2026.02.25

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

76

2026.03.13

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

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

254

2023.09.22

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

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

1111

2024.03.01

php中foreach用法
php中foreach用法

本专题整合了php中foreach用法的相关介绍,阅读专题下面的文章了解更多详细教程。

268

2025.12.04

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

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

77

2025.09.05

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

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

40

2025.11.16

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

69

2026.03.13

热门下载

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

精品课程

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

共58课时 | 6.1万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 3.4万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.6万人学习

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

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