如何定义不需要硬编码名称的转换

How to define a transformation that doesn't require hard-coded names

我有一个有效的转换,但它使用的是硬编码的 属性 名称引用。我一直在努力弄清楚如何定义一个通用的转换,但我还没有找到任何有效的方法。

我的输入数据是这样的:

{
  "data": [
    {
      "A": 1,
      "B": "testing",
      "C": 100
    },
    {
      "A": 2,
      "B": "testing",
      "C": 200
    }
  ],
  "newVals": {
    "B": "new val",
    "C": 7
  }
}

我想应用 newVals 对象中的值并将它们应用到数组中的对象,以便生成的数据如下所示:

[
  {
    "A": 1,
    "B": "new val",
    "C": 7
  },
  {
    "A": 2,
    "B": "new val",
    "C": 7
  }
]

我的转换有效,但需要对 属性 名称进行硬编码。我正在尝试定义一个转换,该转换允许正确修改任何匹配的 属性 名称。因此,如果另一个数据集有一个 属性“D”,在 newVals 对象中有一个新值,它将被应用。

我的硬编码转换如下所示:

[
  {
    "operation": "modify-default-beta",
    "spec": {
      "data": {
        "*": {
          "new_B": "@(3,newVals.B)",
          "new_C": "@(3,newVals.C)"
        }
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "data": {
        "*": {
          "@(0,A)": "[#2].A",
          "@(0,new_B)": "[#2].B",
          "@(0,new_C)": "[#2].C"
        }
      }
    }
  }
]

有没有一种方法可以这样写,除了上面的示例数据之外,它还可以转换这个:

{
  "data": [
    {
      "A": 1,
      "E": "testing",
      "F": 100
    }
  ],
  "newVals": {
    "E": "new val",
    "F": 7
  }
}

对于第一个想要的结果;

modify-default-beta转换为modify-overwrite-beta规范,这种情况不需要重命名键,例如. new_ 不需要前缀。同时,无需显式写入每个元素,而是将它们替换为 "*": "@(3,newVals.&)"。然后只需在 shift 规范中选择 data 数组的对象,例如

[
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "data": {
        "*": {
          "*": "@(3,newVals.&)"
        }
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "data": {
        "@": ""
      }
    }
  }
]

对于第二个想要的结果;

仅使用 shift 规范的一步就足够了,例如

[
  {
    "operation": "shift",
    "spec": {
      "data": {
        "0": {
          "A": "&2.[#2].&",
          "B": "&2.[#2].E",
          "C": "&2.[#2].F"
        }
      },
      "*": "&"
    }
  }
]

其中"*": "&"用来表示除data

以外的数组