Позвольте мне начать с того, что ваш вывод отсутствует Joe Davis
вы показываете дважды Alan Mcgee
, я предполагаю опечатку.
Я делаю определенные предположения, чтобы заставить его работать. Я предполагаю, что (1) если value
является объектом, тогда существует поле internalId
и (2) имеется единственное вложение, происходящее из поля value
- т.е. не более того.
Я мог бы, возможно, немного упростить это или расширить его - у меня сейчас просто нет времени.
К вашему сведению: подтвердите, что это то, что вам нужно, у меня нет времени делать исчерпывающая проверка.
Вот мой код, он самодостаточен, поэтому просто скопируйте и вставьте в Transform Message
процессор.
РЕДАКТИРОВАТЬ: я получил немного дополнительного времени, изменил выражение немного, и добавил комментарии, чтобы объяснить, что делает выражение. Надеюсь, это поможет.
%dw 2.0
output application/dw
var data = {
"line": [{
"lineNumber": 0,
"credit": 17.98,
"customFieldList": {
"customField": [{
"internalId": "5780",
"scriptId": "custcol_del_externalid",
"value": "0000000111111"
},
{
"internalId": "1446",
"scriptId": "custcol_4601_witaxapplies",
"value": false
},
{
"internalId": "1837",
"scriptId": "custcol_nsts_gaw_col_approver",
"value": {
"internalId": "29540",
"name": "Alan Mcgee",
"typeId": "-4"
}
},
{
"internalId": "2648",
"scriptId": "custcol_foreign_expense",
"value": false
}
]
}
},
{
"lineNumber": 1,
"debit": 17.98,
"customFieldList": {
"customField": [{
"internalId": "5780",
"scriptId": "custcol_del_externalid",
"value": "0000000111111"
},
{
"internalId": "1446",
"scriptId": "custcol_4601_witaxapplies",
"value": false
},
{
"internalId": "1837",
"scriptId": "custcol_nsts_gaw_col_approver",
"value": {
"internalId": "29540",
"name": "Joe Davis",
"typeId": "-4"
}
},
{
"internalId": "2648",
"scriptId": "custcol_foreign_expense",
"value": false
}
]
}
}
]
}
---
// Create a new object with a single field named `line`
// Iterate over the array in the `data.line`
line: data.line map { // Create an object where
// you remove the `customFieldList` from the inputs while maintaining the other fields
($ - "customFieldList"),
// Create an object with field names the values of the `scriptId` field.
(do { // Create a localized declaration (aka closure) changing the array into an object
// where each field is the value of the `scriptId` field
var cfs = $.customFieldList.customField groupBy $.scriptId
---
// Iterate over the custom fields (cfs) object
cfs mapObject (v,k) -> (
// The value is an array but I assume you will always have a single element in it.
// Take the only element in the array (while removing the `scriptId` field) and test it
(v[0] - "scriptId") match {
// Check if the `o.value` is an Object if it is create a new object with the same key
// while the value is a new object
case o if (o.value is Object) -> {(k): {
// add all fields from the object you are testing but the `internalId` and the `value`
(o -- ["internalId","value"]),
// add `internalId1` mapped to the top object's `internalId` field
internalId1: o.internalId,
// add `internalId2` mapped to the object stored in the `o.value.internalId`
internalId2: o.value.internalId,
// add all fields from the `o.value` but the `internalId`
(o.value - "internalId"),
// Finally just add `value: false to the new object
value: false
}}
// When `o.value` is not an object then keep it as is.
else -> {(k): $}
}
)
})
}