首页 > web前端 > js教程 > 正文

JavaScript中将JSON对象数组转置为键值数组映射的实用指南

花韻仙語
发布: 2025-11-30 15:17:47
原创
844人浏览过

JavaScript中将JSON对象数组转置为键值数组映射的实用指南

本教程详细介绍了如何在javascript中将一个包含多个json对象的数组转换为一个键值映射对象,其中每个键对应一个属性名,其值则是一个包含所有原始对象中该属性值的数组。文章将通过一个简洁高效的函数实现这一转置操作,并提供代码示例,帮助开发者理解并掌握这种常见的数据结构转换技巧,从而提升数据处理的灵活性和效率。

前端开发或数据处理场景中,我们经常会遇到需要对数据结构进行转换的情况。其中一个常见需求是将一个由多个具有相同结构(或类似结构)的JSON对象组成的数组,转变为一个以属性名为键、以对应属性值数组为值的单一JSON对象。这种转换有助于按属性维度聚合数据,方便进一步的统计、展示或处理。

例如,我们可能有一个用户列表,每个用户是一个对象:

[
 {name: 'Alex', date: '05/17/2023 10:32 PM', id: '00153168', priority: '3-Medium'},
 {name: 'Peter', date: '05/17/2023 11:32 PM', id: '00153169', priority: '3-Medium'}
]
登录后复制

我们期望将其转换为以下形式,以便轻松获取所有用户的姓名列表、日期列表等:

{
name : ['Alex','Peter'],
date : ['05/17/2023 10:32 PM','05/17/2023 11:32 PM'],
id: ['00153168','00153169'],
priority: ['3-Medium', '3-Medium']
}
登录后复制

实现数据转置的函数

为了实现这种数据结构转换,我们可以编写一个名为transpose的通用函数。这个函数将遍历输入的对象数组,并逐一收集每个对象的属性值,将其填充到最终结果对象对应的属性数组中。

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

/**
 * 将对象列表转换为属性列表对象(即数据转置)。
 * 该函数能保留数组中缺失的值,因此输入对象不必完全统一。
 * 实现方式尽可能简洁,不使用复杂的reduce或其他重构方法。
 * @param {Array<Object>} list - 待转置的JSON对象数组。
 * @returns {Object} 转置后的键值数组映射对象。
 */
function transpose(list) {
    const result = {}; // 初始化一个空对象,用于存储转置后的结果

    // 遍历输入数组中的每一个对象
    for (let i = 0; i < list.length; i++) {
        const currentObject = list[i]; // 获取当前对象

        // 遍历当前对象的所有键值对
        for (const [key, value] of Object.entries(currentObject)) {
            // 使用 nullish coalescing assignment (??=) 确保 result[key] 是一个数组。
            // 如果 result[key] 为 null 或 undefined,则将其初始化为空数组 []。
            // 否则,保持其现有值。
            (result[key] ??= [])[i] = value;
        }
    }
    return result; // 返回转置后的结果对象
}
登录后复制

函数解析

  1. const result = {};: 初始化一个空对象result,它将是我们的最终输出。result的键将是原始对象中的属性名(如name, date),而值将是包含所有对应属性值的数组。
  2. for (let i = 0; i < list.length; i++): 外层循环遍历输入数组list中的每一个对象。i代表当前对象的索引,这个索引在后续步骤中至关重要,因为它决定了值在输出数组中的位置。
  3. for (const [key, value] of Object.entries(currentObject)): 内层循环使用Object.entries()方法获取当前对象currentObject的所有键值对。Object.entries()返回一个数组,其中包含[key, value]形式的子数组。
  4. (result[key] ??= [])[i] = value;: 这是实现转置的核心逻辑:
    • result[key] ??= []: 这是一个ES2021引入的空值合并赋值运算符。它的作用是:如果result[key]的值是null或undefined,那么就将result[key]赋值为[](一个空数组);否则,result[key]保持其原有的值。这确保了在第一次遇到某个key时,result[key]会被正确地初始化为一个数组,从而避免了TypeError。
    • [i] = value: 在result[key](现在保证是一个数组)上,将当前对象的value赋值给索引i的位置。由于外层循环的i与原始对象在数组中的位置相对应,这样就能确保所有name属性的值按其原始对象的顺序存储在result.name数组中,date属性的值存储在result.date数组中,以此类推。

使用示例

让我们使用之前定义的输入数据来测试这个transpose函数:

const data = [
 {name: 'Alex', date: '05/17/2023 10:32 PM', id: '00153168', priority: '3-Medium'},
 {name: 'Peter', date: '05/17/2023 11:32 PM', id: '00153169', priority: '3-Medium'}
];

const transposedData = transpose(data);
console.log(transposedData);
登录后复制

输出结果将是:

猫眼课题宝
猫眼课题宝

5分钟定创新选题,3步生成高质量标书!

猫眼课题宝 262
查看详情 猫眼课题宝
{
  "name": [
    "Alex",
    "Peter"
  ],
  "date": [
    "05/17/2023 10:32 PM",
    "05/17/2023 11:32 PM"
  ],
  "id": [
    "00153168",
    "00153169"
  ],
  "priority": [
    "3-Medium",
    "3-Medium"
  ]
}
登录后复制

注意事项

  1. 处理非统一对象结构: 如果输入数组中的对象结构不完全一致(例如,某些对象缺少某个键),transpose函数也能很好地处理。缺失的值在输出数组中将表现为undefined,这会创建稀疏数组。

    const mixedData = [
      {name: 'Alex', id: '001'},
      {name: 'Peter', date: '2023-01-01'},
      {id: '002', priority: 'High'}
    ];
    const transposedMixedData = transpose(mixedData);
    console.log(transposedMixedData);
    /*
    {
      name: ['Alex', 'Peter', undefined],
      id: ['001', undefined, '002'],
      date: [undefined, '2023-01-01', undefined],
      priority: [undefined, undefined, 'High']
    }
    */
    登录后复制

    这种行为通常是期望的,因为它保留了原始数据在“表格”中的相对位置。

  2. 键的顺序: JavaScript对象的键(属性名)在ES2015之后对于非整数键是有序的,但这种顺序通常是它们被创建或插入的顺序。transpose函数创建的result对象中键的顺序将取决于输入对象中第一个出现该键的位置。如果对输出对象中键的特定顺序有严格要求,可能需要额外的排序处理。

  3. 性能: 该方法通过单次遍历输入数组和每个对象的键值对,实现了O(N*M)的时间复杂度,其中N是数组长度,M是对象平均属性数量,效率较高。

总结

将JSON对象数组转置为键值数组映射是数据处理中的一个常见且实用的技巧。本文介绍的transpose函数利用嵌套循环和ES2021的空值合并赋值运算符,提供了一个简洁、高效且健壮的解决方案。它不仅能处理结构统一的数据,也能优雅地应对结构不一致的场景,为开发者在处理复杂数据结构时提供了强大的工具。掌握这种数据转换模式,将有助于更灵活地操作和分析数据。

以上就是JavaScript中将JSON对象数组转置为键值数组映射的实用指南的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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