如何使用 dataweave 根据对象值将对象数组拆分为数组数组

问题描述 投票:0回答:1

就我而言,我有一个对象数组需要根据“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 出现情况按单独的集合进行分割。但它没有按照我期望的方式工作。

请高手帮我解答一下这个逻辑。

提前致谢。

dataweave mulesoft mule4
1个回答
0
投票

这可以使用递归函数在第一次出现“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"
© www.soinside.com 2019 - 2024. All rights reserved.