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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 06:45:05