Jsonnet如何正确编写for循环遍历对象且不影响隐藏属性
Jsonnet遍历对象保留隐藏字段的实现方案
问题根源
普通对象推导语法无法保留原字段的隐藏属性,所有推导生成的字段默认都是公开可见状态,这就是你遇到的要么隐藏字段丢失、要么隐藏字段被公开的原因。
实现方案
使用std.foldl累加构造新对象,配合std.isHiddenField判断原字段可见性,动态构造对应可见性的字段即可解决问题,修改后的applyModifications实现如下:
local applyModifications(kp) = // 遍历第一层字段 std.foldl( function(resultAcc, topLevelKey) local originalTopValue = kp[topLevelKey]; local isTopFieldHidden = std.isHiddenField(kp, topLevelKey); // 遍历第二层字段 local processedTopValue = std.foldl( function(subAcc, subKey) local originalSubValue = originalTopValue[subKey]; local isSubFieldHidden = std.isHiddenField(originalTopValue, subKey); local modifiedSubValue = myfunction(originalSubValue); // 按原字段可见性构造新字段 subAcc + { [if isSubFieldHidden then subKey + "::" else subKey]: modifiedSubValue }, std.objectFieldsAll(originalTopValue), {} ); // 按顶层原字段可见性构造新字段 resultAcc + { [if isTopFieldHidden then topLevelKey + "::" else topLevelKey]: processedTopValue }, std.objectFieldsAll(kp), {} );
效果验证
将你测试代码中的applyModifications替换为上述实现后:
- 原有的隐藏字段
fooService2会保留隐藏属性,不会被公开 - 所有第一层、第二层字段的值都会正确执行
myfunction逻辑,注入spec.foo: 'bar'配置 - 公开字段的可见性也不会发生变化
内容的提问来源于stack exchange,提问作者Heiko Finzel
相关产品推荐
相关产品推荐

