Каковы виды использования $ в dataweave? - PullRequest
2 голосов
/ 09 марта 2020

Я знаю типичный вариант использования $ и $$. Но я взял курс 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!"
}]

Ответы [ 2 ]

7 голосов
/ 09 марта 2020

Позвольте мне объяснить $ $$ $$$, просто чтобы быть на той же странице. Когда вы видите, что они являются переменными ссылками на неявный лямбда-параметр. Позвольте мне привести вам пример

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

Вот как можно написать функцию карты с явной лямбдой

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

Теперь есть способ избежать некоторых кодов болеров и это использование неявной лямбда-функции

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

Что происходит под капотом, так это то, что DW-компилятор вставляет лямбда-объявление

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

Так что каждый раз, когда вы видите знак доллара, просто ссылка на параметр неявной лямбды. Теперь $ - это ссылка на первый параметр $$ - это ссылка на второй $$$ на третий и следующий.

Теперь вторая функция, с которой вы столкнулись, - это объектная функция Dynami c. Эта функция делает все пары ключей и значений, которые присутствуют во вложенном выражении, в содержащий объект. Например, этот код

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

вернет что-то вроде

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

Если вы разбите выражение, вы увидите, что

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

Возвращает

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

И затем все пары значений ключа каждого объекта сглаживаются в родительском контейнере.

Эта функция очень полезна при переходе от Json, который представляет Коллекции с массивом, к Xml, который представляет коллекции с повторяющимися элементами.

3 голосов
/ 09 марта 2020

$ или $$ или даже $$$ - это просто сокращение для входных параметров лямбда-функции. Например, примером longform функции map является payload map (item, index) -> {(index): item}, и это можно переписать, используя сокращение как payload map {($$): $}.

Может также быть, что они устанавливали динамику c введите объект, который необходимо заключить в скобки. Это единственный вариант использования, который я могу придумать вне головы, который потребует, чтобы он был закрыт.

Для каждой функции $ может иметь различное значение, но оно всегда соответствует входному параметру с той же позицией в лямбда-функции. Как правило, рекомендуется по-прежнему использовать длинную форму, чтобы ваш код был легко читаемым, а также чтобы проще было хранить вложенные функции отдельно

Надеюсь, это поможет! Удачи

...