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

如何在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
}

代码说明

  1. 统一管理配置文件:把所有要合并的文件放进configs数组,后续操作无需逐个修改文件引用。
  2. 获取唯一键集合:通过std.objectFields提取每个配置的键,std.flattenArrays把多维键列表转成一维,再用std.unique去重得到所有存在的键。
  3. 合并数组:对每个唯一键,遍历所有配置文件,用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 23:07:35