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

如何将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"}]}

已准备资源

  1. 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}
  1. 代码生成器用模型定义:
{"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));

扩展说明

  1. 固定位置映射:利用fieldname2、fieldname3子值位置固定的特性,直接通过数组索引提取值,对应到目标对象的字段。
  2. 动态根字段兼容:通过Object.entries遍历所有根字段,无需提前知道根字段的顺序或数量。
  3. 批量处理:如果是多条数据,在外层加数组遍历即可:
function transformBatch(rawArray) {
  return rawArray.map(transformPrestoData);
}
  1. 强类型适配:结合已生成的模型定义,可以将转换函数的输入输出绑定到对应类型(比如TypeScript),避免类型错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 17:40:37