如何用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
相关产品推荐
相关产品推荐

