如何在Jsonnet中合并任意键对应的数组值?
Jsonnet合并多文件同键数组的正确实现
解决重复字段错误的核心思路是:先收集所有配置文件中的唯一键,再针对每个键合并所有文件中对应数组的值,避免直接对象推导时的键冲突。
完整实现代码(main.jsonnet)
// 导入所有需要合并的配置文件 local file1 = import 'file1.jsonnet'; local file2 = import 'file2.jsonnet'; local file3 = import 'file3.jsonnet'; // 将所有配置文件存入数组,便于批量处理 local configs = [file1, file2, file3]; // 提取所有配置文件中的唯一键列表 local allKeys = std.unique(std.flattenArrays(std.map(config => std.objectFields(config), configs))); // 构建合并后的最终对象 { [key]: std.flattenArrays(std.map(config => std.get(config, key, []), configs)) for key in allKeys }
代码说明
- 统一管理配置文件:把所有要合并的文件放进
configs数组,后续操作无需逐个修改文件引用。 - 获取唯一键集合:通过
std.objectFields提取每个配置的键,std.flattenArrays把多维键列表转成一维,再用std.unique去重得到所有存在的键。 - 合并数组:对每个唯一键,遍历所有配置文件,用
std.get安全获取对应数组(文件中无该键时返回空数组),最后用std.flattenArrays把多个数组合并成一个。
示例验证
假设各配置文件内容如下:
- file1.jsonnet
{ foo: [1, 2], bar: [3] }
- file2.jsonnet
{ foo: [4], baz: [5, 6] }
- file3.jsonnet
{ bar: [7, 8], baz: [9] }
运行jsonnet main.jsonnet会输出:
{ bar: [3, 7, 8], baz: [5, 6, 9], foo: [1, 2, 4] }
内容的提问来源于stack exchange,提问作者larsks
相关产品推荐
相关产品推荐

