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
相关产品推荐
相关产品推荐

