Мне нужно создать функцию с такими условиями, как этот псевдокод:
var consent = []
function buildConsent() {
if (condition1) {
consent += values1
}
if (condition2) {
consent += values2
}
if (condition3) {
consent += values3
}
}
Вот как я это делаю на Mule4 и DW 2.0:
%dw 2.0
var consent = []
var factIntake = vars.facts
fun buildConsent() =
if (factIntake.miscFactItems[?($.value1 == true)] != null) {
consent + {
"Consent_Type": "some1",
"Consent_Given_By": "some2"
}
}
if (factIntake.miscFactItems[?($.value2 == true)] != null) {
consent + {
"Consent_Type": "some3",
"Consent_Given_By": "some4"
}
}
output application/json
--
{
"Consent_Data": buildConsent()
}
Но я получаю следующую ошибку от IDE (AnypointStudio 7):
Invalid input '+', expected Namespace or Attribute<'@('(Name:Value)+')'> (line 11, column 11):
Где строка 11, столбец 11 — это первое появление consent +
. Если я попытаюсь отладить проект, все, что я получу в консоли, это:
Message : Error while parsing script: %dw 2.0
Вот пример ввода/вывода, чтобы вы лучше поняли, чего я пытаюсь достичь:
// Input
{
"miscFactItems": [{
"factId": "designeeFirstName",
"factValue": "test test",
"factValueType": "System.String"
}, {
"factId": "designeeLastName",
"factValue": "test test",
"factValueType": "System.String"
},{
"factId": "value1",
"factValue": true,
"factValueType": "System.Boolean"
}, {
"factId": "value2",
"factValue": true,
"factValueType": "System.Boolean"
}, {
"factId": "value3",
"factValue": true,
"factValueType": "System.Boolean"
}
]
}
// Output
consent = [{
"Consent_Type": "type1",
"Consent_Given_By": miscFactItems.designeeFirstName
}, {
"Consent_Type": "type2",
"Consent_Given_By": miscFactItems.designeeFirstName
}, {
"Consent_Type": "type3",
"Consent_Given_By": miscFactItems.designeeFirstName
}
]
Что мне здесь не хватает? Как мне добавить три условия в мою функцию и добавить значения в переменную consent
?
@Shoki нет, они не в полезной нагрузке, у меня могут быть оба условия, и поэтому их нужно добавить в массив consent
Будет проще дать точный ответ с ожидаемым вводом/выводом
@Shoki помогает ли мое редактирование? Я добавил набор ВВОД/ВЫВОД :)
Ваше требование выглядит как хорошее использование функции reduce
. Основываясь на предоставленном вами псевдокоде, вы можете сделать что-то вроде ниже
output application/json
var payload = [
{"name":"Ram", "email":"[email protected]", "state": "CA","age":21},
{"name":"Bob", "email":"[email protected]","state": "CA","age":30},
{"name":"john", "email":"[email protected]","state": "NY","age":43}
]
---
payload reduce ((item, consent = []) -> consent +
{
(state: item.state) if (item.state=='CA'),
(age: item.age) if (item.age >25)
}
)
Что ж, я не уменьшаю полезную нагрузку, потому что она отличается от вывода, поэтому мне нужно создать новый JSON на основе условий из функции, не уверен, что я не понимаю, что ваше решение, возможно, поможет.
В DataWeave переменные неизменяемы, поэтому вы не можете накапливать вещи в одной и той же переменной, вам нужно создавать новые переменные.
Таким образом, это будет выглядеть примерно так:
%dw 2.0
output application/json
var consent1 = if (condition1) [{"Consent_Type": "some1", "Consent_Given_By": "some2"}] else []
var consent2 = if (condition2) [{"Consent_Type": "some3", "Consent_Given_By": "some4"}] else []
---
consent1 ++ consent2
Условия взаимоисключающие?