Как используется $ в 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!"
}]

person Dale    schedule 09.03.2020    source источник
comment
Вы имеете в виду что-то вроде этого Дейла {($)}?   -  person George    schedule 09.03.2020
comment
@ Джордж, я редактировал вопрос. Звонит ли это в колокол?   -  person Dale    schedule 09.03.2020
comment
Да, это @Dale. @machaval довольно хорошо объясняет это ниже. Удалите массив из вывода выше, и у вас должно получиться то, что делает (), когда он появляется l-value внутри {}.   -  person George    schedule 10.03.2020
comment
Простое использование ($) в классе было в контексте итерации массива объектов, я показал, как вы можете свернуть текущий объект, который вы повторяете (т.е. $), в новый объект. Что-то вроде этого, если payload - это массив объектов: payload map { newfield: "newvalue", ($) }. Имеет смысл?   -  person George    schedule 10.03.2020
comment
@George Это именно то, что я искал. И коллапс - это то слово, которое я искал. Спасибо.   -  person Dale    schedule 10.03.2020
comment
Итак, вариант использования для этого, если вы хотите добавить несколько полей к каждому объекту в массиве?   -  person Dale    schedule 10.03.2020
comment
Да, @Dale - это один из вариантов использования; есть еще.   -  person George    schedule 11.03.2020


Ответы (2)


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

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

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

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

Теперь есть способ избежать некоторой части кода bolierplate - использовать неявную лямбда-функцию.

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

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

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

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

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

{
  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, представляющему коллекции с повторяющимися элементами.

person machaval    schedule 09.03.2020

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

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

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

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

person maddestroyer7    schedule 09.03.2020