You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 06:45:41