$在dataweave中的用途是什么?

Dal*_*ale 2 dataweave mulesoft

我知道 $ 和 $$ 的典型用例。但是,我参加了 Dataweave 课程并将其用于其他用途,我认为对于此用例,需要将其括在括号中,即 ($)。它展平了整个对象(或类似的东西)。我找不到有关它的文档。一个例子将不胜感激。

我认为存在的东西是这样的。

输入:

[
    {
        "message1": "Hello world!"
    },
    {
        "message2": "Hello world!"
    },
    {
        "message3": "Hello world!"
    }
]
Run Code Online (Sandbox Code Playgroud)

数据:

payload map $
Run Code Online (Sandbox Code Playgroud)

将产生此输出:

[
  {
    "message1": "Hello world!"
  },
  {
    "message2": "Hello world!"
  },
  {
    "message3": "Hello world!"
  }
]
Run Code Online (Sandbox Code Playgroud)

但是,我认为 $ 的简单用法可以给我这个输出(我不记得它是否在数组内,但可能):

[{
    "message1": "Hello world!",
    "message2": "Hello world!",
    "message3": "Hello world!"
}]
Run Code Online (Sandbox Code Playgroud)

mac*_*val 7

让我解释一下 $ $$ $$$ 只是为了在同一页面上。当您看到它们是对隐式 lambda 参数的变量引用时。让我给你举个例子

[3,7,11] map ((item,index) -> {a: item, b: index})
Run Code Online (Sandbox Code Playgroud)

这就是使用显式 lambda 编写映射函数的方式

((item,index) -> {a: item, b: index})
Run Code Online (Sandbox Code Playgroud)

现在有一种方法可以避免一些样板代码,并且是使用隐式 lambda 功能

[3,7,11] map  {a: $, b: $$}
Run Code Online (Sandbox Code Playgroud)

幕后发生的事情是 DW 编译器插入了一个 lambda 声明

[3,7,11] map  (($, $$) -> {a: $, b: $$})
Run Code Online (Sandbox Code Playgroud)

因此,每次您看到美元符号时,都只是对隐式 lambda 参数的引用。现在 $ 是第一个参数的引用 $$ 是对第二个 $$$ 到第三个及以下参数的引用。

现在您面临的第二个特征是动态对象特征。此功能的作用是将包含在表达式中的所有键值对展平到包含的对象中。例如这个代码

{
  a: "Literal KVP",
  ([1,2,3] map {($$): $}), //Dynamic kev value pairs
  (c: "Conditional KVP") if(random() > 0.2)
}
Run Code Online (Sandbox Code Playgroud)

会返回类似的东西

{
  "a": "Literal KVP",
  "0": 1,
  "1": 2,
  "2": 3,
  "c": "Conditional KVP"
}
Run Code Online (Sandbox Code Playgroud)

如果你打破这个表达式,你会看到

([1,2,3] map {($$): $})
Run Code Online (Sandbox Code Playgroud)

退货

[
  {
    "0": 1
  },
  {
    "1": 2
  },
  {
    "2": 3
  }
]
Run Code Online (Sandbox Code Playgroud)

然后每个对象的所有键值对都在容器父级中展平。

当从表示带有数组的集合的 Json 到表示带有重复元素的集合的 Xml 时,此功能非常有用。