如何高效地将嵌套对象数组扁平化为键值映射结构
发布时间 - 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 => {
// 找出非 'quanti
ty' 的属性名(即 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环境调试操作说明【操作】
高端建站如何打造兼具美学与转化的品牌官网?
上一篇:python如何单步调试
下一篇:python中如何求阶乘
上一篇:python如何单步调试
下一篇:python中如何求阶乘


ty' 的属性名(即 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;
});
}