如何将Presto查询返回的嵌套数组转换为嵌套对象?
问题描述
需要将Presto SQL返回的嵌套数组结构数据,转换为指定的嵌套对象格式。核心特点:
- 根层级字段位置不固定,但
fieldname2、fieldname3的子字段值位置固定 - 原始数据仅返回纯值,无结构化标识
输入数据
{"fieldname1": "value","fieldname3": ["value 1",[["firstname","lastname"]]],"fieldname2": [[["value 3"],"full name"]]}
目标输出
{"fieldname1": "value","fieldname3": {"field3_sub1": "value 1","field3_sub2": [{"field3_sub2_1": "firstname","field3_sub2_2": "lastname"}]},"fieldname2": [{"field2_sub1": ["value 3"],"field2_sub2": "full name"}]}
已准备资源
- JSON Schema:
{"type": "object","properties": {"fieldname2": {"type": "array","items": {"type": "object","properties": {"field2_sub1": {"type": "array","items": {"type": "string"}},"field2_sub2": {"type": "string"}},"additionalProperties": false,"title": "fieldname2"}},"fieldname1": {"type": "string"},"fieldname3": {"type": "object","properties": {"field3_sub1": {"type": "string"},"field3_sub2": {"type": "array","items": {"type": "object","properties": {"field3_sub2_1": {"type": "string"},"field3_sub2_2": {"type": "string"}},"additionalProperties": false,"title": "field3_sub2"}}},"additionalProperties": false,"title": "fieldname3"}},"additionalProperties": false}
- 代码生成器用模型定义:
{"Fieldname2": {"root": false,"fields": {"field2_sub1": {"name": "field2_sub1","fieldType": "string[]","graphqlType": "[String]","nullable": true,"filter": false},"field2_sub2": {"name": "field2_sub2","fieldType": "string","graphqlType": "String","nullable": true,"filter": true}}},"Field3_sub2": {"root": false,"fields": {"field3_sub2_1": {"name": "field3_sub2_1","fieldType": "string","graphqlType": "String","nullable": true,"filter": true},"field3_sub2_2": {"name": "field3_sub2_2","fieldType": "string","graphqlType": "String","nullable": true,"filter": true}}},"Fieldname3": {"root": false,"fields": {"field3_sub1": {"name": "field3_sub1","fieldType": "string","graphqlType": "String","nullable": true,"filter": true},"field3_sub2": {"name": "field3_sub2","fieldType": "Field3_sub2[]","graphqlType": "[Field3_sub2]","nullable": true,"filter": false}}},"Record": {"root": true,"fields": {"fieldname2": {"name": "fieldname2","fieldType": "Fieldname2[]","graphqlType": "[Fieldname2]","nullable": true,"filter": false},"fieldname1": {"name": "fieldname1","fieldType": "string","graphqlType": "String","nullable": true,"filter": true},"fieldname3": {"name": "fieldname3","fieldType": "Fieldname3","graphqlType": "Fieldname3","nullable": true,"filter": false}}}}
解决方案
核心逻辑:遍历原始数据的所有根字段,对fieldname2、fieldname3按固定位置映射到目标结构,其余字段直接保留。以下是JavaScript实现示例:
function transformPrestoData(rawData) { const result = {}; // 遍历所有根字段,兼容动态位置 for (const [key, value] of Object.entries(rawData)) { switch (key) { case 'fieldname3': // 按固定索引提取值,映射到目标对象 result[key] = { field3_sub1: value[0], field3_sub2: value[1].map(item => ({ field3_sub2_1: item[0], field3_sub2_2: item[1] })) }; break; case 'fieldname2': // 遍历数组元素,按索引映射字段 result[key] = value.map(item => ({ field2_sub1: item[0], field2_sub2: item[1] })); break; default: // 非目标字段直接复制 result[key] = value; } } return result; } // 测试转换 const rawInput = {"fieldname1": "value","fieldname3": ["value 1",[["firstname","lastname"]]],"fieldname2": [[["value 3"],"full name"]]}; console.log(JSON.stringify(transformPrestoData(rawInput), null, 2));
扩展说明
- 固定位置映射:利用
fieldname2、fieldname3子值位置固定的特性,直接通过数组索引提取值,对应到目标对象的字段。 - 动态根字段兼容:通过
Object.entries遍历所有根字段,无需提前知道根字段的顺序或数量。 - 批量处理:如果是多条数据,在外层加数组遍历即可:
function transformBatch(rawArray) { return rawArray.map(transformPrestoData); }
- 强类型适配:结合已生成的模型定义,可以将转换函数的输入输出绑定到对应类型(比如TypeScript),避免类型错误。
内容的提问来源于stack exchange,提问作者noxify
相关产品推荐
相关产品推荐

