0

0

JavaScript中基于键前缀拆分扁平化对象的指南

碧海醫心

碧海醫心

发布时间:2025-11-11 18:32:01

|

756人浏览过

|

来源于php中文网

原创

JavaScript中基于键前缀拆分扁平化对象的指南

本教程详细介绍了如何在javascript中将一个包含多个以数字前缀命名的键值对的扁平化对象,转换成一个由多个独立对象组成的数组。通过遍历原始对象的键,提取键前缀进行分组,并最终将分组结果转换为目标数组,实现数据结构的重塑,提高数据的可读性和可操作性。

在JavaScript开发中,我们有时会遇到需要重塑数据结构的情况。例如,当一个对象的所有属性都扁平化地存储在一个单一对象中,且这些属性的键名遵循特定的命名模式(如带有数字前缀),我们可能需要将其拆分成一个包含多个独立对象的数组,每个对象代表一组相关的属性。本教程将详细讲解如何实现这一转换。

问题场景与目标

假设我们有一个数组,其中只包含一个对象。这个对象的键名以数字开头,后跟实际的键名,例如 "0key1", "0key2", "1key1", "1key2" 等。

原始数据结构示例:

const originalData = [{
  "0key1": "a33",
  "0key2": "Aab",
  "0key3": "i",
  "1key1": "e78",
  "1key2": "Vib",
  "1key3": "j",
  "2key1": "c99",
  "2key2": "Aig",
  "2key3": "k"
}];

我们的目标是将上述单一对象拆分成一个数组,其中每个元素都是一个独立的对象,包含原始数据中相同数字前缀的键值对。

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

期望的目标数据结构:

[
  {"0key1":"a33","0key2":"Aab","0key3":"i"},
  {"1key1":"e78","1key2":"Vib","1key3":"j"},
  {"2key1":"c99","2key2":"Aig","2key3":"k"}
]

解决方案概述

实现这一转换的核心思路是:

  1. 遍历原始对象的所有键。
  2. 对于每个键,提取其开头的数字前缀。
  3. 使用一个中间对象来暂存结果,以数字前缀作为键,值为一个新的对象,用于收集所有具有相同前缀的键值对。
  4. 最终,将中间对象的所有值(即那些按前缀分组后的新对象)提取出来,形成一个数组。

详细实现步骤

我们将创建一个名为 splitArray 的函数来封装这个逻辑。

PaperFake
PaperFake

AI写论文

下载

1. 定义函数与处理输入

首先,定义一个函数 splitArray,它接收一个数组作为输入。由于我们的原始数据是一个包含单一对象的数组,我们将直接操作 input[0]。

function splitArray(input) {
  // 用于暂存按前缀分组后的对象
  const splitObjects = {};

  // 获取原始数组中的第一个对象
  const sourceObject = input[0];

  // ... 后续逻辑
}

2. 遍历对象键并分组

使用 Object.keys() 方法获取 sourceObject 的所有键,然后使用 forEach() 方法遍历这些键。

  Object.keys(sourceObject).forEach((key) => {
    // 提取键的第一个字符作为前缀
    const firstChar = key.substr(0, 1);

    // 如果 splitObjects 中还没有这个前缀对应的子对象,则初始化它
    splitObjects[firstChar] = splitObjects[firstChar] || {};

    // 将当前键值对添加到对应的子对象中
    splitObjects[firstChar][key] = sourceObject[key];
  });

代码解释:

  • key.substr(0, 1): 从当前键名中截取第一个字符。例如,对于键 "0key1",firstChar 将是 "0"。
  • splitObjects[firstChar] = splitObjects[firstChar] || {};: 这是一个常见的JavaScript模式,用于确保 splitObjects[firstChar] 是一个对象。如果 splitObjects[firstChar] 尚未定义(即 undefined),它会被初始化为一个空对象 {}。否则,它将保持其现有值。
  • splitObjects[firstChar][key] = sourceObject[key];: 将原始对象中当前键 key 及其对应的值 sourceObject[key] 添加到 splitObjects 中以 firstChar 为键的子对象里。

3. 提取结果

在遍历完成后,splitObjects 将是一个类似这样的结构:

{
  "0": {"0key1":"a33","0key2":"Aab","0key3":"i"},
  "1": {"1key1":"e78","1key2":"Vib","1key3":"j"},
  "2": {"2key1":"c99","2key2":"Aig","2key3":"k"}
}

我们需要的是一个数组,其中包含这些子对象。可以使用 Object.values() 方法来获取 splitObjects 的所有值,这些值正是我们期望的独立对象。

  return Object.values(splitObjects);

完整代码示例

将上述步骤整合,得到完整的 splitArray 函数:

const original = [{
  "0key1": "a33",
  "0key2": "Aab",
  "0key3": "i",
  "1key1": "e78",
  "1key2": "Vib",
  "1key3": "j",
  "2key1": "c99",
  "2key2": "Aig",
  "2key3": "k"
}];

/**
 * 将包含数字前缀键的扁平化对象拆分为多个独立对象组成的数组。
 *
 * @param {Array<Object>} input 包含一个扁平化对象的数组,其键名以数字前缀开头。
 * @returns {Array<Object>} 拆分后的对象数组。
 */
function splitArray(input) {
  // 用于暂存按前缀分组后的对象
  const splitObjects = {};

  // 获取原始数组中的第一个对象进行处理
  const sourceObject = input[0];

  // 遍历源对象的所有键
  Object.keys(sourceObject).forEach((key) => {
    // 提取键的第一个字符作为分组前缀
    const firstChar = key.substr(0, 1);

    // 如果 splitObjects 中还没有这个前缀对应的子对象,则初始化它
    // 确保 splitObjects[firstChar] 始终是一个对象
    splitObjects[firstChar] = splitObjects[firstChar] || {};

    // 将当前键值对添加到对应的子对象中
    splitObjects[firstChar][key] = sourceObject[key];
  });

  // 返回 splitObjects 的所有值,这些值就是按前缀分组后的独立对象数组
  return Object.values(splitObjects);
}

// 运行函数并输出结果
console.log('转换后的数据:', splitArray(original));

/*
  预期输出:
  [
    {"0key1":"a33","0key2":"Aab","0key3":"i"},
    {"1key1":"e78","1key2":"Vib","1key3":"j"},
    {"2key1":"c99","2key2":"Aig","2key3":"k"}
  ]
*/

注意事项

  1. 输入结构假设: 本教程的解决方案假定输入是一个包含单个对象的数组。如果输入数组包含多个需要进行类似转换的对象,您需要对数组进行迭代(例如使用 map() 方法),并对每个对象应用 splitArray 函数的核心逻辑。
  2. 键前缀模式: 此方法依赖于键名以单个字符作为前缀的模式(例如 0key1 中的 0)。如果前缀是多位数字(如 10key1)或其他更复杂的模式,您需要调整 key.substr(0, 1) 或使用正则表达式来正确提取前缀。
  3. 键名唯一性: 这种分组方式要求具有相同前缀的键名在原始对象中是唯一的,否则后面的同名键会覆盖前面的值。在示例中,0key1、0key2 等是唯一的。
  4. 性能考量: 对于非常大的对象,Object.keys() 和 forEach() 的组合通常是高效的。但在极端性能敏感的场景下,可以考虑其他优化,例如使用 for...in 循环(需要额外检查 hasOwnProperty)。

总结

通过本教程,我们学习了如何利用JavaScript的对象操作方法(Object.keys()、forEach()、Object.values())将一个扁平化的、键名带有数字前缀的单一对象,有效地重塑为一个结构化、可读性更强的独立对象数组。这种技术在处理从后端API获取的、需要进行客户端数据规范化的场景中尤为实用。理解并掌握这种数据转换模式,将有助于您更灵活地处理各种复杂的数据结构。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

WorkBuddy
WorkBuddy

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
js正则表达式
js正则表达式

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

531

2023.06.20

正则表达式不包含
正则表达式不包含

正则表达式,又称规则表达式,,是一种文本模式,包括普通字符和特殊字符,是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式的文本。php中文网给大家带来了有关正则表达式的相关教程以及文章,希望对大家能有所帮助。

258

2023.07.05

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

766

2023.07.05

java正则表达式匹配字符串
java正则表达式匹配字符串

在Java中,我们可以使用正则表达式来匹配字符串。本专题为大家带来java正则表达式匹配字符串的相关内容,帮助大家解决问题。

219

2023.08.11

正则表达式空格
正则表达式空格

正则表达式空格可以用“s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。本专题为大家提供正则表达式相关的文章、下载、课程内容,供大家免费下载体验。

357

2023.08.31

Python爬虫获取数据的方法
Python爬虫获取数据的方法

Python爬虫可以通过请求库发送HTTP请求、解析库解析HTML、正则表达式提取数据,或使用数据抓取框架来获取数据。更多关于Python爬虫相关知识。详情阅读本专题下面的文章。php中文网欢迎大家前来学习。

293

2023.11.13

正则表达式空格如何表示
正则表达式空格如何表示

正则表达式空格可以用“s”来表示,它是一个特殊的元字符,用于匹配任意空白字符,包括空格、制表符、换行符等。想了解更多正则表达式空格怎么表示的内容,可以访问下面的文章。

245

2023.11.17

正则表达式中如何匹配数字
正则表达式中如何匹配数字

正则表达式中可以通过匹配单个数字、匹配多个数字、匹配固定长度的数字、匹配整数和小数、匹配负数和匹配科学计数法表示的数字的方法匹配数字。更多关于正则表达式的相关知识详情请看本专题下面的文章。php中文网欢迎大家前来学习。

547

2023.12.06

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

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

26

2026.03.13

热门下载

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

精品课程

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

共58课时 | 6万人学习

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号