#dataweave #mulesoft
#dataweave #mulesoft
Вопрос:
У меня есть объект JSON, который имеет такие поля, как subject1, subject2, subject3 со строковыми массивами в качестве значения.
Если какой-либо элемент поиска существует внутри строковых массивов, который присваивается полям subject1, subject2, subject3, тогда мне нужно добавить ключ или это поле из объекта Json в существующий массив (myArray),
%dw 2.0
var myArray = [];
var subjects = {
"subject1" = ["sectionA", "sectionB", "sectionC"],
"subject2" = ["sectionB", "sectionD", "sectionE"],
"subject3" = ["sectionC", "sectionF", "sectionG"],
}
fun getSubjects(section) = mapping mapObject ((value, key, index) ->
if(value contains key) myArray << key
else myArray
)
---
{
"subjects" : getSubjects(var.section) // var.section = sectionA
}
Но я получаю эту ошибку «Невозможно принудительно преобразовать массив в объект». Есть ли лучший способ сделать это?
Комментарии:
1. Привет, @chakez! Не могли бы вы предоставить содержимое var.section? Кроме того, если бы вы могли добавить пример ввода и ожидаемый результат? Спасибо.
2. какой o / p вы хотите здесь, объясните это более подробно, например, какой тип o / p вам нужен?
3. @chakez вы не можете этого сделать, потому что все типы данных неизменяемы в dataweave. Вам придется делать это рекурсивно, по сути, создавая каждый раз новый массив с обновленным содержимым.
Ответ №1:
Я думаю, это то, что вы пытались сделать; поскольку данные неизменяемы в dataweave, вам нужно использовать что-то вроде reduce, если вы хотите выполнить итерацию коллекции при изменении чего-то вроде содержимого массива.
%dw 2.0
var subjects = {
"subject1": ["sectionA", "sectionB", "sectionC"],
"subject2": ["sectionB", "sectionD", "sectionE"],
"subject3": ["sectionC", "sectionF", "sectionG"]
}
var section = "sectionA"
fun getSubjects(section) = subjects pluck $ reduce ((subject, myArray=[]) ->
if (subjects[subject] contains section) myArray << subject
else myArray
)
---
{
subjects: getSubjects(section)
}
Выдает:
{
subjects: [
"subject1"
]
}
Ответ №2:
Есть еще один способ сделать это, как показано ниже, где мы отправляем переменную и строку, которые должны соответствовать
%dw 2.0
var myArray = []
var subjects = {
"subject1" : ["sectionA", "sectionB", "sectionC"],
"subject2" : ["sectionA", "sectionD", "sectionE"],
"subject3" : ["sectionC", "sectionF", "sectionG"],
}
fun adding(inputarray,matchingkey)= flatten(inputarray mapObject ((value, key) ->
(("myArray"): (myArray [key])) if ((value) contains matchingkey)
) pluck $)
---
adding(subjects,"sectionC")
Вывод:
[
"subject1",
"subject3"
]