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

如何将数组内的对象拆分转换为指定结构的多对象数组?

数据结构转换问题

我有如下结构的对象数组:其中fixedValue是固定存在的,内层fixedValue数组的每个对象中category和total字段也固定,但"Col 2"、"Col 3"等为随机命名的字段,数量不固定,除category和total外的其他键名可能为任意随机字符串:

originalDataSet = [
    {
        "fixedValue": [
            {
                "category": "SD",
                "total": 2,
                "Col 2": 208,
                "Col 3": 88,
                "Col 4": 4,
                ....
            },
            {
                "category": "EFG",
                "total": 1,
                "Col 2": 106,
                "Col 3": 46,
                "Col 4": 4,
                ....
            },
            {
                "category": "ERG",
                "total": 1,
                "Col 2": 107,
                "Col 3": 47,
                "Col 4": 5,
                ....
            },
            ....
        ]
    }
]

我的目标是将其转换为如下结构:

newDataSet = [{
  fixedValue: [
    {
      name: "SD",
      fixedValue: [
        { name: "Col 2", value: 208 },
        { name: "Col 3", value: 88 },
        { name: "Col 4", value: 4 },
        ...
      ]
    },
    {
      name: "EFG",
      fixedValue: [
        { name: "Col 2", value: 106 },
        { name: "Col 3", value: 46 },
        { name: "Col 4", value: 4 },
        ...
      ]
    },
    {
      name: "ERG",
      fixedValue: [
        { name: "Col 2", value: 107 },
        { name: "Col 3", value: 47 },
        { name: "Col 4", value: 5 },
        ...
      ]
    },
    ....
  ]}
]

转换规则:将原数据中每个对象的category值作为新键name的值,将除category和total外的所有键值对转换为{name: 键名, value: 键值}的结构。

我目前写了如下代码,但感觉方向有误,请问如何实现目标结构newDataSet?

// First work with the array in originalDataSet.fixedValue
const newObj = {};

// For each object in the fixedValue array
for (const key of originalDataSet.fixedValue) {

    // If the key does not equal to 'category' or 'total' e.g., in this example we're referring to 'Col 2', 'Col 3', and 'Col 4', though there could be more.
    if(!key['category'] && !key['total'])

        // Should yield something like this: { name: "Col 2", value: 107 }
        newObj['name']  = key;
        newObj['value'] = newObj[key];
    }
}

originalDataSet.fixedValue.foreach(
    newDataSet = [{
        fixedValue: [
            name: item.category
            fixedValue: [newObj]
        ]
    }]
}

解决方案

你的代码存在循环逻辑错误(误将数组元素当成键遍历)、forEach拼写错误、对象语法缺失(缺少逗号与大括号),且复用同一个newObj会导致所有项引用同一对象的问题。可以用map方法结合对象遍历工具实现转换,逻辑更清晰:

const newDataSet = originalDataSet.map(outerItem => {
  // 转换内层fixedValue数组
  const transformedFixedValue = outerItem.fixedValue.map(innerItem => {
    // 筛选并转换非category、total的键值对
    const innerFixedValue = Object.entries(innerItem)
      .filter(([key]) => key !== 'category' && key !== 'total')
      .map(([name, value]) => ({ name, value }));
    
    return {
      name: innerItem.category,
      fixedValue: innerFixedValue
    };
  });

  return {
    fixedValue: transformedFixedValue
  };
});

代码说明:

  1. 外层map遍历originalDataSet的每个元素(此处仅一个外层对象)
  2. 内层map遍历每个fixedValue中的对象:
    • Object.entries将对象转为键值对数组,方便后续处理
    • filter剔除category和total两个固定字段
    • map将剩余键值对转换为{name: 键名, value: 键值}的目标格式
    • 返回包含name(原category值)和fixedValue(转换后的数组)的对象
  3. 外层最终返回包含转换后fixedValue的对象,组成最终的newDataSet

内容的提问来源于stack exchange,提问作者Beginner_Hello

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 00:46:09