
本教程详细介绍了如何将一个包含多个json对象的数组,高效地转换为一个以原对象属性名为键、属性值集合为值的映射对象。通过一个简洁的j*ascript函数,我们将展示如何实现这种数据结构的转置,确保数据完整性并处理非统一对象的情况,从而优化数据访问和处理逻辑。
在J*aScript开发中,我们经常会遇到需要对数据结构进行转换的场景。其中一个常见需求是将一个包含多个JSON对象的数组,转换成一个以属性名为键、以对应属性值集合为值的映射对象。这种转换可以将“行式”数据(每个对象代表一行记录)变为“列式”数据(每个键代表一列属性值),便于进行批量操作或数据分析。
例如,给定以下JSON对象数组:
[
{name: 'Alex', date: '05/17/2025 10:32 PM', id: '00153168', priority: '3-Medium'},
{name: 'Peter', date: '05/17/2025 11:32 PM', id: '00153169', priority: '3-Medium'}
]我们期望将其转换为如下结构:
{
name : ['Alex','Peter'],
date : ['05/17/2025 10:32 PM','05/17/2025 11:32 PM'],
id: ['00153168','00153169'],
priority: ['3-Medium', '3-Medium']
}这种转换在数据聚合、报表生成或前端组件的数据绑定等场景中非常有用。
为了实现上述数据结构的转置,我们可以编写一个通用的transpose函数。该函数能够将一个对象列表(list of objects)转换为一个列表对象(object of lists),并能优雅地处理输入对象可能不完全统一的情况。
/**
* 将对象列表转换为属性列表对象。
* 该函数保持了原始值在数组中的顺序,并能处理输入对象属性不完全一致的情况。
* @param {Array<Object>} list - 待转置的JSON对象数组。
* @returns {Object<string, Array<any>>} - 转置后的键值映射对象。
*/
function transpose(list) {
const result = {}; // 初始化一个空对象,用于存储转置后的结果
// 遍历输入数组中的每一个对象
for (let i = 0; i < list.length; i++) {
// 遍历当前对象的每一个键值对
for (const [k, v] of Object.entries(list[i])) {
// 使用 nullish coalescing assignment (??=) 确保 result[k] 是一个数组。
// 如果 result[k] 为 null 或 undefined,则将其初始化为空数组 []。
// 然后,将当前值 v 赋值给 result[k] 数组的第 i 个位置。
// 这样可以确保值按照它们在原始数组中的顺序被收集。
(result[k] ??= [])[i] = v;
}
}
return result;
}transpose 函数的核心在于其双层循环和巧妙的赋值逻辑。
const result = {};函数开始时,我们创建一个空的result对象。这个对象将作为最终转置结果的容器,其键将是原始JSON对象的属性名,而值将是包含所有对应属性值的数组。
for (let i = 0; i < list.length; i++) {
// ...
}外层循环负责遍历输入的list数组。循环变量i不仅用于访问数组中的每个对象(list[i]),更重要的是,它被用作在result对象中构建的每个值数组的索引。这确保了转置后的值能够保持其在原始数据中的相对顺序。
来画数字人|直播|
来画数字人自动化|直播|,无需请真人主播,即可实现24小时|直播|,无缝衔接各大|直播|平台。
57
查看详情
for (const [k, v] of Object.entries(list[i])) {
// ...
}内层循环使用Object.entries(list[i])来遍历当前对象list[i]的所有可枚举属性。Object.entries()方法返回一个给定对象自身可枚举字符串键属性的键值对数组。通过解构赋值[k, v],我们可以方便地获取每个属性的键(k)和值(v)。
这是函数最精妙的部分,它结合了ES2025引入的空值合并赋值运算符(Nullish Coalescing Assignment Operator ??=)和数组索引赋值。
result[k] ??= []: 这个表达式首先检查result对象中是否存在以k为键的属性。
(...)[i] = v;: 在result[k]被确保为数组之后,我们使用外层循环的索引i将当前属性值v赋值到result[k]数组的相应位置。 例如,当处理第一个对象(i=0)时,所有属性的值都会被放入各自键对应数组的第0个位置。处理第二个对象(i=1)时,值会被放入第1个位置,依此类推。这种方式有效地将每个对象的属性值“堆叠”到各自的列中。
此函数的一个显著优点是它能优雅地处理输入对象属性不完全一致的情况。如果某个对象缺少某个属性,那么在转置后的对应数组中,该位置将简单地留空(即为undefined),而不会导致错误或数据丢失,这在处理不规则数据时非常有用。
让我们结合提供的示例数据,演示transpose函数的实际使用。
const data = [
{name: 'Alex', date: '05/17/2025 10:32 PM', id: '00153168', priority: '3-Medium'},
{name: 'Peter', date: '05/17/2025 11:32 PM', id: '00153169', priority: '3-Medium'}
];
/**
* 将对象列表转换为属性列表对象。
* 该函数保持了原始值在数组中的顺序,并能处理输入对象属性不完全一致的情况。
* @param {Array<Object
>} list - 待转置的JSON对象数组。
* @returns {Object<string, Array<any>>} - 转置后的键值映射对象。
*/
function transpose(list) {
const result = {};
for (let i = 0; i < list.length; i++) {
for (const [k, v] of Object.entries(list[i])) {
(result[k] ??= [])[i] = v;
}
}
return result;
}
const transposedData = transpose(data);
console.log(transposedData);运行上述代码,您将得到以下输出:
{
name: [ 'Alex', 'Peter' ],
date: [ '05/17/2025 10:32 PM', '05/17/2025 11:32 PM' ],
id: [ '00153168', '00153169' ],
priority: [ '3-Medium', '3-Medium' ]
}这正是我们期望的转置结果。
将JSON对象数组转置为键值映射是一个常见且实用的数据处理任务。通过本文介绍的transpose函数,您可以高效、健壮地实现这一转换。该函数利用J*aScript的现代特性(如Object.entries和空值合并赋值运算符),以简洁而强大的方式解决了问题,同时优雅地处理了数据不一致的情况。掌握这种数据转置技巧,将有助于您更灵活地处理和组织J*aScript中的数据。
以上就是将JSON对象数组转置为键值映射的实用指南的详细内容,更多请关注其它相关文章!
# java
# 潮流推广视频素材网站
# 印刷行业线下产品推广营销
# seo需要优化哪些内容
# 并能
# 是一个
# 不完全
# 如何实现
# 转换为
# 运算符
# 组中
# 遍历
# javascript
# js
# 前端
# json
# 数据访问
# 数据丢失
# 键值对
# javascript开发
# 键值
# 数据结构
# 营销推广及人员分配
# 广东网站建设游戏
# 重庆网站建设中
# 淮北建设网站公司
# 三大网站推广
# 汕头网站建设讲解透彻
# 福建定制型网站建设推广
相关文章:
解决Python logging 中 datefmt 导致时间戳固定不变的问题
CSS布局:解决全屏元素100%尺寸与外边距导致的页面溢出问题
支付宝碰一碰设备是REDMI手机吗 博主拆机辟谣:处理器、内存都不一样
在J*a中如何开发在线活动报名与管理系统_活动报名管理项目实战解析
Python复杂任务中断策略:通过回调函数实现优雅停止
蛙漫2台版漫画地址 Manwa2正版网页版链接
谷歌浏览器最新官方入口链接 谷歌浏览器网页版官网导航
在J*a中如何开发简易仓库管理与库存统计_仓库管理库存统计项目实战解析
Python async/await 协程:CPU密集型任务的陷阱与解决方案
Yandex免登录网页版地址 Yandex搜索引擎官方访问入口
LINQ to XML为何解析失败? 深入理解C# XDocument的异常处理
BetterDiscord插件中安全更新用户简介的实践指南
我的世界mc.js免费游戏直接能玩 我的世界mc.js小游戏免费秒玩入口
vivo云服务网页版登录 怎么登录vivo云服务网页版
12306选座如何查看座位示意图_12306座位示意图解读与使用
cad怎么合并重叠的线段_cad清理重复重叠线条的操作方法
AO3中文官网链接_AO3网页版稳定镜像站
windows10怎么查看本机ip_windows10命令提示符ipconfig使用
J*aScript打印功能_j*ascript输出控制
c++项目目录结构应该如何组织_c++工程化项目结构规范
Golang如何优化CPU绑定任务分配策略_Golang CPU任务分配优化实践
迅雷下载到U盘速度很慢怎么办_迅雷U盘下载慢优化方法
KFC套餐升级怎么获取优惠代码_KFC套餐升级活动与优惠代码获取方法
如何将HTML表格多行数据保存到Google Sheet
漫蛙漫画官方首页 漫蛙2漫画在线阅读入口
铁路12306的积分有效期是多久_铁路12306积分有效期说明
qq浏览器如何查看和导出已保存的密码 qq浏览器密码管理器数据备份教程
深入理解与实现最大堆的Heapify过程:常见错误与修正
PowerPoint如何制作滚动字幕结尾彩蛋_PowerPoint路径动画实现平滑滚动字幕效果
sublime如何配置Python开发环境_将sublime打造成轻量级Python IDE
小米14应用无法联网原因分析_小米14网络权限修复
PySpark中高效提取字符串右侧可变长度数字:使用regexp_extract
微信网页版官方快速登录入口 微信网页版网页版账号直达
实现分段式页面滚动导航:CSS与J*aScript教程
AngularJS $http POST请求数据传递与Go后端接收实践
Go语言中动态执行代码字符串的策略与实践
解决Python单元测试中Mock异常方法调用计数为零的问题
电脑屏幕颜色不舒服怎么办_Windows夜间模式与色彩校准教程【护眼技巧】
qq浏览器打开空白页怎么办 qq浏览器启动后显示白屏的解决教程
Angular Material 垂直步进器:实现底部到顶部排序的教程
顺丰快递查单号物流信息 顺丰快递小程序查询入口
在Qt QML中通过Python字典动态更新TextEdit内容的教程
马斯克:Optimus 人形机器人复数形式为 Optimi
抖音创作助手登录入口_抖音创作辅助工具官网直达
Eclipse怎么运行工程_Eclipse工程运行配置说明
谷歌邮箱注册显示错误Gmail服务器异常与延迟处理
Mac终端命令大全_Mac常用Terminal指令速查
J*aScript map 迭代中检测空数组元素的有效方法
QQ网页版官方账号入口 QQ网页版网页版登录指南
html怎么在cmd下运行php文件_cmd运行html中php文件方法【教程】
*请认真填写需求信息,我们会在24小时内与您取得联系。