$在dataweave中有什么用?

What are the uses of $ in dataweave?

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

我以为是这样的。

输入:

[
    {
        "message1": "Hello world!"
    },
    {
        "message2": "Hello world!"
    },
    {
        "message3": "Hello world!"
    }
]

DW:

payload map $

将产生此输出:

[
  {
    "message1": "Hello world!"
  },
  {
    "message2": "Hello world!"
  },
  {
    "message3": "Hello world!"
  }
]

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

[{
    "message1": "Hello world!",
    "message2": "Hello world!",
    "message3": "Hello world!"
}]

$$$ 甚至 $$$ 只是 lambda 函数输入参数的简写形式。例如,map 函数的长格式示例是 payload map (item, index) -> {(index): item} 并且可以使用 shorthand 将其重写为 payload map {($$): $}.

也可能是他们在对象中设置动态键,需要用括号括起来。这是我能想到的唯一需要将其封闭的用例。

对于每个函数,$可能有不同的含义,但它总是对应于lambda函数中相同位置的输入参数。通常最好的做法是仍然使用长格式,这样您的代码易于阅读,并且还允许嵌套函数更容易保持分离

希望对您有所帮助!祝你好运

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

[3,7,11] map ((item,index) -> {a: item, b: index})

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

((item,index) -> {a: item, b: index})

现在有一种方法可以避免某些 bolierplate 代码,那就是使用隐式 lambda 功能

[3,7,11] map  {a: $, b: $$}

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

[3,7,11] map  (($, $$) -> {a: $, b: $$})

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

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

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

会 return 像

{
  "a": "Literal KVP",
  "0": 1,
  "1": 2,
  "2": 3,
  "c": "Conditional KVP"
}

如果你打破表达式你会看到

([1,2,3] map {($$): $})

Returns

[
  {
    "0": 1
  },
  {
    "1": 2
  },
  {
    "2": 3
  }
]

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

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