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

如何使用JOLT根据通用键值数组合并对象?

JOLT合并同foo_name值的对象(保留首次出现的键值)

输入JSON

{
  "people": [
    {
      "foo_name": "jack",
      "id": 123,
      "some_attr1": "val1"
    },
    {
      "foo_name": "bob",
      "id": 456,
      "some_other_attr1": "val2"
    },
    {
      "foo_name": "jack",
      "cool_attr1": "val3",
      "not_cool_attr1": "val4",
      "some_attr1": "vvaaalllllll"
    }
  ]
}

期望输出

{
  "people": [
    {
      "foo_name": "jack",
      "id": 123,
      "some_attr1": "val1", // 若存在重复键,保留第一个值
      "cool_attr1": "val3", // 合并后键的顺序无关紧要
      "not_cool_attr1": "val4"
    },
    {
      "foo_name": "bob",
      "id": 456,
      "some_other_attr1": "val2"
    }
  ]
}

需求说明

  • 按foo_name的值分组合并对象,foo_name的具体值预先未知
  • 相同foo_name的对象合并后,重复的键保留首次出现的值
  • 合并后对象的键顺序不做要求

当前尝试的JOLT规则

[
  {
    "operation": "shift",
    "spec": {
      "people": { // 仅处理people数组
        "*": { // 遍历每个元素
          "foo_name": { // 按foo_name分组
            "*": {
              "@2": "&[]"
            }
          }
        }
      }
    }
  }
]

正确的JOLT规则

[
  // 反转数组,让原首个元素最后处理,确保其键值能覆盖后续同foo_name的元素
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "people": "=reverse(@)"
    }
  },
  // 按foo_name分组,合并所有键值对
  {
    "operation": "shift",
    "spec": {
      "people": {
        "*": {
          "*": "&2_&(1,foo_name).&"
        }
      }
    }
  },
  // 将分组后的对象转换为数组
  {
    "operation": "shift",
    "spec": {
      "people_*": "people[]"
    }
  }
]

规则解释

  1. 反转数组:利用JOLT中「后处理的键值会覆盖先处理的」特性,反转后原数组中首次出现的jack对象会最后被处理,其键值会覆盖后续jack对象的重复键,从而保留初始值。
  2. 分组合并:通过&2_&(1,foo_name)将每个元素的键值对映射到以people_foo_name值为键的对象下,自动合并同foo_name的所有键值对。
  3. 转数组:将所有分组后的对象收集到people数组中,得到最终的合并结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 06:27:47