如何高效地将嵌套对象数组扁平化为键值映射结构

发布时间 - 2026-01-09 00:00:00    点击率:

本文介绍一种高效、可读性强的方法,将包含 `items` 数组(每个 item 是形如 `{ [keyprop]: name, quantity: value }` 的对象)的源数组,转换为每个顶层对象直接携带动态属性(如 `crust: 2.2`, `dust: 34`)的新数组。

在实际开发中,我们常遇到类似场景:原始数据结构为“订单+明细项”嵌套形式,但前端渲染或后续处理更倾向扁平化的字段映射(例如将商品名作为属性键、数量作为值)。针对该需求,最清晰且性能可控的方案是使用 Array.prototype.map() 配合对象解构与动态赋值。

以下是一个健壮、生产就绪的实现:

function flattenItems(arr) {
  return arr.map(obj => {
    // 浅拷贝原对象,避免污染输入数据
    const result = { ...obj };

    // 移除 items 字段(后续将明细展开为顶层属性)
    delete result.items;

    // 遍历每个明细项,提取 productX 属性值作为新键,quantity 作为值
    obj.items?.forEach(item => {
      // 找出非 'quantity' 的属性名(即 productOne/productTwo/productThree 等)
      const keyField = Object.keys(item).find(key => key !== 'quantity');
      if (keyField && typeof item[keyField] === 'string' && 'quantity' in item) {
        const propName = item[keyField]; // 如 "crust", "dust"
        const propValue = item.quantity; // 如 2.2, 34
        result[propName] = propValue;
      }
    });

    return result;
  });
}

使用示例:

const firstArray = [
  {
    amount: 343,
    code: "RCU8YI0NKS",
    items: [
      { productOne: "crust", quantity: 2.2 },
      { productTwo: "dust", quantity: 34 }
    ],
    user_id: "wewewefwOHG22323kj"
  },
  {
    amount: 343,
    code: "RCU8YI0NKS",
    items: [
      { productTwo: "dust", quantity: 32 },
      { productThree: "must", quantity: 34 }
    ],
    user_id: "m2LgLRD9MEVNAX56JTpRYDkOOjd2"
  }
];

console.log(flattenItems(firstArray));
// 输出即为目标格式 secondArray

⚠️ 注意事项:

  • 该方法假设每个 item 中有且仅有一个非 quantity 的字符串键(如 productOne),其值即为要注入的属性名;若存在多个非 quantity 字段,请根据业务逻辑明确提取规则(例如优先取 productOne,或合并所有 product* 值)。
  • 使用可选链 obj.items?.forEach(...) 提升容错性,避免 items 缺失时抛错。
  • 若需深度克隆(而非浅拷贝),可引入 structuredClone()(现代环境)或 Lodash 的 cloneDeep()。
  • 时间复杂度为 O(n × m),其中 n 是外层数组长度,m 是平均 items 长度——这是该问题的理论最优解,无可避免的遍历开销。

总结:无需依赖外部库,仅用原生 JavaScript 即可安全、高效完成嵌套到扁平的结构转换;关键在于精准识别动态键名,并通过对象扩展语法完成属性注入。


# javascript  # java  # 前端  # red 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 教学论文网站制作软件有哪些,写论文用什么软件 ?  简单实现Android文件上传  Python正则表达式进阶教程_复杂匹配与分组替换解析  Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  Laravel中的withCount方法怎么高效统计关联模型数量  Laravel如何使用Telescope进行调试?(安装和使用教程)  Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】  如何快速生成可下载的建站源码工具?  Python文件流缓冲机制_IO性能解析【教程】  PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】  laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法  Swift开发中switch语句值绑定模式  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层  如何快速生成橙子建站落地页链接?  Mybatis 中的insertOrUpdate操作  微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】  Laravel如何生成API文档?(Swagger/OpenAPI教程)  Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】  Laravel如何实现邮箱地址验证功能_Laravel邮件验证流程与配置  网站页面设计需要考虑到这些问题  Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理  JS碰撞运动实现方法详解  大连 网站制作,大连天途有线官网?  如何在云主机上快速搭建多站点网站?  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)  猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】  百度输入法ai组件怎么删除 百度输入法ai组件移除工具  专业商城网站制作公司有哪些,pi商城官网是哪个?  Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法  网站建设要注意的标准 促进网站用户好感度!  Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】  Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧  如何基于云服务器快速搭建个人网站?  HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】  如何在Ubuntu系统下快速搭建WordPress个人网站?  个人网站制作流程图片大全,个人网站如何注销?  香港服务器租用每月最低只需15元?  悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音  JS弹性运动实现方法分析  Android自定义listview布局实现上拉加载下拉刷新功能  如何有效防御Web建站篡改攻击?  nodejs redis 发布订阅机制封装实现方法及实例代码  INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】  Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  长沙企业网站制作哪家好,长沙水业集团官方网站?  php在windows下怎么调试_phpwindows环境调试操作说明【操作】  高端建站如何打造兼具美学与转化的品牌官网?