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

Power Query如何将记录列表动态转换为列?

动态将JSON数组映射为列的实现方案

需求回顾

从API获取的JSON包含固定字段(如主ID、其他属性)和一个结构统一的动态数组,数组每个元素含ID、Value、Text字段,需将数组元素转为列而非展开成新行,且自动适配数组长度变化(如2条→4条)。


示例输入输出

输入JSON

{
  "id": "main_123",
  "category": "User",
  "attributes": [
    {"id": "attr_01", "Value": "John Doe", "Text": "Full Name"},
    {"id": "attr_02", "Value": 30, "Text": "Age"},
    {"id": "attr_03", "Value": "john@example.com", "Text": "Email"}
  ]
}

期望输出JSON

{
  "id": "main_123",
  "category": "User",
  "Full Name": "John Doe",
  "Age": 30,
  "Email": "john@example.com"
}

核心实现代码

以下提供两种主流语言的实现,均支持动态数组长度适配:

JavaScript 版本

// 单条数据转换
function transformSingleData(rawData) {
  // 复制固定字段(排除目标数组)
  const transformed = {...rawData};
  delete transformed.attributes; // 替换为你的数组字段名

  // 遍历动态数组,生成对应列
  rawData.attributes.forEach(item => {
    // 优先用Text作为列名, fallback到ID避免空值
    const columnName = item.Text || `attr_${item.id}`;
    transformed[columnName] = item.Value;
  });

  return transformed;
}

// 批量数据转换(多条主数据)
function transformBatchData(rawBatch) {
  return rawBatch.map(transformSingleData);
}

Python 版本

# 单条数据转换
def transform_single_data(raw_data):
    # 复制固定字段(排除目标数组)
    transformed = {k: v for k, v in raw_data.items() if k != 'attributes'}
    # 遍历动态数组生成列
    for item in raw_data['attributes']:
        column_name = item.get('Text', f'attr_{item["id"]}')
        transformed[column_name] = item['Value']
    return transformed

# 批量数据转换
def transform_batch_data(raw_batch):
    return [transform_single_data(item) for item in raw_batch]

进阶优化:处理列名冲突

若数组中存在Text重复的元素,可添加计数后缀避免覆盖:

JavaScript 冲突修复版

function transformDataWithConflictFix(rawData) {
  const transformed = {...rawData};
  delete transformed.attributes;
  const columnNameTracker = {};

  rawData.attributes.forEach(item => {
    let baseName = item.Text || `attr_${item.id}`;
    let columnName = baseName;

    // 检查列名是否已存在,存在则加后缀
    while (columnName in transformed || columnName in columnNameTracker) {
      columnNameTracker[baseName] = (columnNameTracker[baseName] || 0) + 1;
      columnName = `${baseName}_${columnNameTracker[baseName]}`;
    }

    transformed[columnName] = item.Value;
    columnNameTracker[baseName] = (columnNameTracker[baseName] || 0) + 1;
  });

  return transformed;
}

关键特性

  • 完全动态适配数组长度:无论数组有2条还是10条元素,都会自动生成对应列
  • 兼容空数组:若数组为空,仅保留原固定字段
  • 灵活列名映射:可根据需求切换用Text或ID作为列名
  • 冲突处理:进阶版本避免重复列名导致的数据覆盖

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 02:45:40