JavaScript如何将单层对象过滤转换为二级结构对象数组
JavaScript平面对象转按序分组对象数组实现
问题说明
现有存储多组价格、数量的平面对象,键名以字段名+数字序号的格式命名,需要转换为按组聚合的对象数组,原始数据与目标格式如下:
原始数据:
const originalData = { "price1": 100, "amount1": 17.46, "price2": 500, "amount2": 29, "price3": 700, "amount3": 40.74 }
目标输出:
const newData =[ {price:100, amount:17.46}, {price:500, amount:29}, {price:700, amount:40.74} ]
通用实现方案(适配序号不连续/字段扩展场景)
用reduce做分组聚合,不需要提前知道数据总组数,也兼容序号不连续的情况:
const newData = Object.values( Object.entries(originalData).reduce((groupMap, [key, val]) => { // 拆分键名中的字段类型和数字序号 const [field, groupIndex] = key.match(/[a-zA-Z]+|\d+/g); // 初始化当前序号的分组对象 if (!groupMap[groupIndex]) groupMap[groupIndex] = {}; groupMap[groupIndex][field] = val; return groupMap; }, {}) );
核心逻辑说明:
- 用
Object.entries将原始对象转为[键, 值]形式的可遍历数组 - 通过正则拆分每个键的字段名(price/amount)和所属分组序号,以序号为key做分组存储
- 最后用
Object.values取出分组对象的所有值,直接得到目标格式的数组
轻量实现方案(适配序号连续规则固定场景)
如果确定数据的序号是从1开始连续递增、没有缺号,可以直接用循环取值,代码更简洁:
const newData = []; let i = 1; while (originalData.hasOwnProperty(`price${i}`)) { newData.push({ price: originalData[`price${i}`], amount: originalData[`amount${i}`] }); i++; }
内容的提问来源于stack exchange,提问作者Eunsim Kang
相关产品推荐
相关产品推荐

