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

如何将嵌套数组外部的已知键合并为该数组的对象元素?

问题描述

现有输入JSON:

[
  {
    "some_key": "x",
    "foo_id": 123,
    "foo_name": "bar_1",
    "all_foo": [
      {
        "foo_id": 456,
        "foo_name": "bar_2"
      }
    ]
  }
]

需求:将外层的foo_id和foo_name封装为对象,合并到all_foo数组中,同时移除原外层的这两个键,最终输出结构如下(all_foo数组元素顺序无要求):

[
  {
    "some_key": "x",
    "all_foo": [
      {
        "foo_id": 123,
        "foo_name": "bar_1"
      },
      {
        "foo_id": 456,
        "foo_name": "bar_2"
      }
    ]
  }
]

已尝试的Jolt转换规则:

[
  {
    "operation": "shift",
    "spec": {
      "*": "&",
      "all_foo": {
        "*": "&",
        "&1": "[&1].&"
      }
    }
  }
]
正确Jolt转换方案

可以通过shift操作完成需求,这里提供两种实现方式:

方式一:指定数组位置(可控顺序)

[
  {
    "operation": "shift",
    "spec": {
      "*": {
        // 保留原对象中除foo相关键外的其他字段
        "some_key": "[&1].&",
        // 将外层foo_id、foo_name封装为对象,放到all_foo数组的第一个位置
        "foo_id": "[&1].all_foo[0].&",
        "foo_name": "[&1].all_foo[0].&",
        // 将原all_foo数组的元素追加到后续位置
        "all_foo": {
          "*": "[&2].all_foo[#2].&"
        }
      }
    }
  }
]

规则说明

  • 外层"*"遍历输入数组的每个对象;
  • "[&1].&"中&1指代外层数组的索引,&保留原键名,实现some_key的原样保留;
  • all_foo[0]固定将外层的foo键值对放到数组首位;
  • [&2].all_foo[#2].&中&2回溯到外层数组索引,#2表示原all_foo数组的元素索引+1,确保原数组元素接在新对象之后。

方式二:自动追加数组(无顺序要求)

如果不关心all_foo的元素顺序,可使用更简洁的规则:

[
  {
    "operation": "shift",
    "spec": {
      "*": {
        "some_key": "[&1].&",
        // 匹配所有foo_开头的键,封装为对象后追加到all_foo数组
        "foo_*": "[&1].all_foo[].&",
        // 将原all_foo数组的所有元素追加到目标数组
        "all_foo": {
          "*": "[&2].all_foo[]"
        }
      }
    }
  }
]

规则说明

  • "foo_*"匹配所有以foo_开头的字段,all_foo[]会自动将这些键值对封装为单个对象并追加到数组;
  • 原all_foo数组的元素通过[&2].all_foo[]也追加到目标数组,最终两个对象会合并到同一个数组中,满足需求中“顺序无要求”的条件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 23:32:17