Добавить ключ в массив, если элемент существует с помощью Dataweave

#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"
]