У меня есть более 50 000 объектов json, спрятанных во вложенных массивах. Я хочу вытащить их, чтобы они могли быть в одном массиве. Также эти вложенные массивы довольно случайны и не имеют шаблона. Например
[ [ [ [ [ {"a":1 }], [{"b":2 } ] ], [[{"c":3 }]] ] ], [{"d":4 }] ]
должен быть преобразован в
[{"а":1},{"б":2},{"в":3},{"д":4}]
с использованием Dataweave 2.0
Используется сглаживание, но не похоже, что это правильная функция.
Вот один из способов сделать это с помощью рекурсивной функции:
%dw 2.0
output application/json
fun flattenAllLevels(arr: Array) = do {
arr reduce ((item, acc = []) ->
item match {
case x is Array -> acC++ flattenAllLevels(x)
else -> acc << item
}
)
}
---
flattenAllLevels(payload)
Поскольку количество объектов велико и может быть в любом формате, вы должны помнить ограничение рекурсии Dataweave
Это еще одна версия выравнивания вложенных массивов. Скорее всего, оно будет менее эффективным, чем уже принятое решение, потому что оно требует большей итерации. Тем не менее, здесь используется хвостовая рекурсия, поэтому вам не нужно беспокоиться об ограничении рекурсии Dataweave , и поэтому он может обрабатывать даже более глубокий уровень вложенности.
Если вам нужно обрабатывать сильно вложенные массивы (скажем,> 50), вы можете использовать это. В противном случае раствор Шоки более эффективен
%dw 2.0
import some from dw::core::Arrays
output application/json
@TailRec()
fun flattenAllLevels(arr: Array) = do {
var flattenedLevel1 = flatten(arr)
---
if (flattenedLevel1 some ($ is Array)) flattenAllLevels(flattenedLevel1)
else flattenedLevel1
}
// Helper function to create deeply nested array.
// for example, calling getDeepArray(5) will create [5,[4,[3,[2,[1,[0]]]]]]
fun getDeepArray(level) =
1 to level
reduce ((item, acc=[0]) -> ( [item] << acc ))
---
flattenAllLevels(getDeepArray(500))
flatten работает на первом уровне массива, а не во вложенных массивах.