TL; DR: As of March 2025, there’s no deep merge function in Jsonnet’s standard library yet. So I wrote something myself.
merge(obj1, obj2):: local all_fields = std.set(std.objectFields(obj1) + std.objectFields(obj2)); { [f]: if !std.objectHas(obj1, f) then obj2[f] // no need to merge if the field only exist in 1 object else if !std.objectHas(obj2, f) then obj1[f] // deep merge recursively else if std.type(obj1[f]) == 'object' && std.type(obj2[f]) == 'object' then this.merge(obj1[f], obj2[f]) // combine if they are arrays else if std.type(obj1[f]) == 'array' && std.type(obj2[f]) == 'array' then obj1[f] + obj2[f] // meaningless to combine if they're of different types or string, int or bool, etc. // value from obj2 will be used else obj2[f] for f in all_fields },
Not sure if I should do a PR to contribute but my last attempt was still there hanging 🙂