Я пытаюсь разобраться с функцией сокращения в Mulesoft Dataweave 2.0.
ожидаемый результат:
{
"dev": "1",
"test": "2",
"uat": "3",
"prod": "4"
}
мой код данных:
%dw 2.0
var invar = [
{"id": "1", "name": "dev"},
{"id": "2", "name": "test"},
{"id": "3", "name": "uat"},
{"id": "4", "name": "prod"}
]
output application/json
---
// invar reduce() ??? requirment: it must be done with reduce function.
Спасибо
Хитрость заключается в том, чтобы установить для аккумулятора правильное значение, когда DataWeave не может вывести его автоматически:
%dw 2.0
var invar = [
{"id": "1", "name": "dev"},
{"id": "2", "name": "test"},
{"id": "3", "name": "uat"},
{"id": "4", "name": "prod"}
]
output application/json
---
invar reduce ((item, accumulator= {}) -> accumulator ++ {(item.name):item.id})
Спасибо, Алед, до сих пор не могу понять, почему это работает. Потому что, когда вы выполняете конкатенацию, строки складываются вместе. Таким образом, Dataweave «знает», когда параметр индекса сокращения = {}, что результат должен быть между фигурными скобками. Верно ?
reduce() работает с массивами, но операция конкатенации «++» может работать с массивами, строками, объектами и несколькими типами комбинаций дат. Поскольку я установил аккумулятор на объект, а вторым параметром конкатенации является другой объект, он выполняет конкатенацию объектов, как описано на docs.mulesoft.com/mule-runtime/4.3/…
Именно, функция ++ перегружена для разных типов DataWeave.
Инициализируйте аккумулятор для пустого объекта {} и добавьте сформированные пары ключ-значение в аккумулятор для требуемого вывода:
invar reduce ((item, accumulator = {}) -> accumulator ++ {(item.name): item.id } )
Здесь есть ответ , который я объясняю
reduce