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

如何用Jsonnet实现多对象合并?求通用合并函数方案

Jsonnet合并多个对象的正确方法

要合并Jsonnet中的多个对象(无论是对象的嵌套值列表,还是直接的对象列表),std.foldl是最简洁高效的方式,它能将二元的+合并操作应用到整个对象列表上,实现累积合并。

核心思路

std.foldl会遍历列表中的每个对象,用+运算符将当前对象与之前累积的结果合并,最终得到一个合并后的对象(后面的对象会覆盖前面同键的值,符合配置合并的常见需求)。

针对你的场景实现

以你提供的嵌套配置对象为例:

local config = {
  conf1: { key1: 'val', foo: 'bar' },
  confN: { keyN: 'val', foo: 'baz' }
};

// 提取所有嵌套配置对象到列表
local confList = std.objectValuesAll(config);

// 用foldl累积合并所有对象
local merged_config = std.foldl(function(acc, obj) acc + obj, confList, {});

merged_config

执行后会得到你预期的结果:

{
  key1: 'val',
  keyN: 'val',
  foo: 'baz'
}

封装通用合并函数

如果需要频繁合并任意数量的对象,可以封装一个通用函数,同时支持对象列表和对象的嵌套值:

// 通用合并函数:接收对象列表,返回合并后的对象
local mergeObjects(objList) = std.foldl(function(acc, obj) acc + obj, objList, {});

// 用法1:合并对象的嵌套值
local config = {
  conf1: { key1: 'val', foo: 'bar' },
  conf2: { key2: 'val2', foo: 'baz' },
  conf3: { key3: 'val3' }
};
local mergedFromObj = mergeObjects(std.objectValuesAll(config));

// 用法2:直接合并对象列表
local mergedFromList = mergeObjects([
  { a: 1 },
  { b: 2, a: 100 },
  { c: 3 }
]);

{
  mergedFromObj: mergedFromObj,
  mergedFromList: mergedFromList
}

为什么推导式不适合你的场景

推导式(for ...)的作用是生成新的对象/数组结构,比如批量生成键值对,而不是用来做累积计算。你之前尝试用推导式模拟循环累积,不符合Jsonnet推导式的设计场景,所以无法得到预期结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 06:17:16