就我而言,我有一个对象数组需要根据“L1”出现情况进行拆分。例如,下面的 JSON 请求有多个 L1。
[
{
"route": "F1",
"Company Code": "One Total Item Count"
},
{
"route": "D1",
"Company Code": "Two Total PO Amount"
},
{
"route": "L1",
"Company Code": "Three Total Item Count"
},
{
"route": "F1",
"Company Code": "One Total PO Amount"
},
{
"route": "D1",
"Company Code": "Two Total Item Count"
},
{
"route": "L1",
"Company Code": "Three Total Item Count"
},
{
"route": "D1",
"Company Code": "Two Total Item Count"
},
{
"route": "L1",
"Company Code": "Three Total Item Count"
}
]
我正在尝试基于 L1 进行拆分,并期待如下响应。
[
[
{
"route": "F1",
"Company Code": "One Total Item Count"
},
{
"route": "D1",
"Company Code": "Two Total PO Amount"
},
{
"route": "L1",
"Company Code": "Three Total Item Count"
}
],
[
{
"route": "F1",
"Company Code": "One Total PO Amount"
},
{
"route": "D1",
"Company Code": "Two Total Item Count"
},
{
"route": "L1",
"Company Code": "Three Total Item Count"
}
],
[
{
"route": "D1",
"Company Code": "Two Total Item Count"
},
{
"route": "L1",
"Company Code": "Three Total Item Count"
}
]
]
在 dataweave 中,我尝试了 spiltAt、filter 和其他函数,根据 L1 出现情况按单独的集合进行分割。但它没有按照我期望的方式工作。
请高手帮我解答一下这个逻辑。
提前致谢。
这可以使用递归函数在第一次出现“L1”时进行分割来解决(
splitAt((a indexWhere (item) -> item.route == value) + 1)
),然后递归地将相同的逻辑应用于数组的其余部分。我们需要注意完成递归的条件,以避免无限递归或得到空数组。
问题没有澄清最后一个元素是否始终具有“L1”值。如果没有,这个脚本也应该可以工作。
为了获得额外的可重用性,我将条件设置为闭包。由于我的函数有两个参数,因此可以在 DataWeave 中与固定表示法一起使用,例如
splitAt()
。
%dw 2.0
output application/json
import * from dw::core::Arrays
fun splitAfter(a, condition)= do {
var splitted = a splitAt((a indexWhere condition($)) + 1)
---
if (sizeOf(a) > 1 and !isEmpty(splitted.l))
[splitted.l] ++ splitAfter(splitted.r, condition)
else
a
}
---
payload splitAfter (item) -> item.route == "L1"