当前位置: 首页 > 知识库问答 >
问题:

如何在Mule Dataweave中循环并组合成一个整体

白永昌
2023-03-14

我有json的请求和预期的响应,如下所述。它需要group pByclientItemCode,我在中途卡住了在同一个地方循环。使用了MapObject减少函数的组合。任何帮助都将不胜感激。

[
{
  "ClientCode": "1",
  "ClientItemCode": "245",
  "LocationId": "CLOSED"
 },
 {
  "ClientCode": "1",
  "ClientItemCode": "245",
  "LocationId": "OPEN"
 },
    {
  "ClientCode": "2",
  "ClientItemCode": "245",
  "LocationId": "CHECKOUT"
 },
 {
  "ClientCode": "2",
  "ClientItemCode": "245",
  "LocationId": "TEST"
 },
 {
  "ClientCode": "1",
  "ClientItemCode": "123",
  "LocationId": "OPEN"
 },
 {
  "ClientCode": "1",
  "ClientItemCode": "123",
  "LocationId": "CLOSED"
 }
 ]

预期响应:

  <Results>
  <Result>
    <ClientItemCode>123<ClientItemCode>
    <ResultLines>
      <ResultLine>
        <ClientCode>1</ClientCode>
        <From>
          <LocationId>OPEN</LocationId>
        </From>
        <To>
          <LocationId>CLOSED</LocationId>
        </To>
      </ResultLine>
       <ResultLine>
        <ClientCode>2</ClientCode>
        <From>
          <LocationId>CHECKOUT</LocationId>
        </From>
        <To>
          <LocationId>TEST</LocationId>
        </To>
      </ResultLine>
    </ResultLines>
  </Result>
  <Result>
   <CientItemCode>245<ClientItemCode>
   <ResultLines>
      <ResultLine>
        <ClientCode>1</ClientCode>
        <From>
          <LocationId>CLOSED</LocationId>
        </From>
        <To>
          <LocationId>OPEN</LocationId>
        </To>
     </ResultLine>
    </ResultLines>
  </Result>
</Results>

共有2个答案

柳飞鸾
2023-03-14

假设打开和/或关闭可能丢失:

%dw 2.0
output application/xml
---
Results: payload groupBy $.ClientItemCode
    mapObject ((value, key, index) -> result: {
            ClientItemCode: key,
            ResultLines: {
                From: if (value.LocationId contains "OPEN") LocationId: "OPEN" else null,
                To: if (value.LocationId contains "CLOSED") LocationId: "CLOSED" else null

            }
        } 
    )

输出:

<?xml version='1.0' encoding='UTF-8'?>
<Results>
  <result>
    <ClientItemCode>245</ClientItemCode>
    <ResultLines>
      <From>
        <LocationId>OPEN</LocationId>
      </From>
      <To>
        <LocationId>CLOSED</LocationId>
      </To>
    </ResultLines>
  </result>
  <result>
    <ClientItemCode>123</ClientItemCode>
    <ResultLines>
      <From>
        <LocationId>OPEN</LocationId>
      </From>
      <To>
        <LocationId>CLOSED</LocationId>
      </To>
    </ResultLines>
  </result>
</Results>
翟俊
2023-03-14

这是我想出来的,如果我有更多的时间投入,可能会简化一点。试一试:

%dw 2.0
output application/xml
var data = [
 {
  "ClientCode": "1",
  "ClientItemCode": "245",
  "LocationId": "CLOSED"
 },
 {
  "ClientCode": "1",
  "ClientItemCode": "245",
  "LocationId": "OPEN"
 },
    {
  "ClientCode": "2",
  "ClientItemCode": "245",
  "LocationId": "CHECKOUT"
 },
 {
  "ClientCode": "2",
  "ClientItemCode": "245",
  "LocationId": "TEST"
 },
 {
  "ClientCode": "1",
  "ClientItemCode": "123",
  "LocationId": "OPEN"
 },
 {
  "ClientCode": "1",
  "ClientItemCode": "123",
  "LocationId": "CLOSED"
 }
]
---
// I assume that your data are ordered and all the records that will be From and To
// are paired with one another. It is doable without making such assumption but the
// algorithm will get complex.
results: do {
    // Group by the data
    var groupedData = data map {($),(From: true) if (isEven($$))} groupBy $.ClientItemCode
    // Order the client Ids
    var orderedClientIds = groupedData pluck $$ orderBy $ as Number
    ---
    orderedClientIds reduce (cId, results={}) -> do {
        var clientItemCode = cId
        var groupedByClientICode = groupedData[cId] groupBy $.ClientCode pluck $
        ---
        results ++ {result: {
            ClientItemCode: clientItemCode,
            ResultLines: groupedByClientICode reduce (cliCode, lines={}) -> do {
                var clientCode = cliCode[0].ClientCode
                ---
                lines ++ {
                    ClientCode: clientCode,
                    ResultLine: cliCode reduce (e, acc={}) -> do {
                        var locRec = {LocationId: e.LocationId}
                        ---
                        acc ++ (if (e.From?) {From: locRec } else {To: locRec})
                    }
                }
            }
        }}
    }
}

当我在注释中复制时,我还做了一个假设:我假设您的数据是有序的,并且所有将成为FromTo的记录都彼此配对。

编辑:再次编辑代码,以强制对< code>ClientItemCode进行排序,然后在创建< code>result标记的所有转换之前按顺序访问每个值。剩下的代码几乎和以前一样。不知道为什么一个简单的< code>orderBy对你没有用,但对我有用。

 类似资料:
  • 问题内容: 我见过类似的问题,但没有一个提供我所要的答案,因此,如果这被认为是重复的,我在此致歉。我正在尝试将数组{1,2,3}和{4,5,6}合并为{1,2,3,4,5,6}。我做错了什么?我是java的新手。抱歉,问题很愚蠢。 问题答案: 代替 您需要调用merge方法,并将结果分配给数组,例如: 您的for循环也应该是:

  • 问题内容: 我有两个数组。 我需要合并这些数组,并在下拉列表中显示为 我怎么能使用swift.im新手来快速获得此结果,有人可以帮忙吗? 问题答案: 压缩数组并连接结果:

  • 我正在努力实现这样的目标。这是一个虚构的例子,表达了这个意图。 我希望所有可完成的未来都能执行,并将所有结果合并为一个结果,然后返回。因此,对于下面的示例,集合allResults应该有字符串“1”、“2”、“3”,每个字符串有3次。我希望它们都并行运行,而不是串行运行。 任何关于未来我可以使用什么API来实现这一点的建议都会非常有用。

  • 问题内容: 考虑下表, 我如何获得以下结果 尝试过的形式但未获得正确的结果,数学将始终放在Subject_1之下,而Science总是在SUbject_2之下。 问题答案: 使用: 最大限度 通过…分组 SQL>选择名称, 2个最大(subject_1)subject_1, 3个最大(marks_1)个marks_1, 4个MAX(subject_2)subject_2, 5个最大(marks_2

  • 我想扫描一个整数,并把它放在一个while循环,以便如果输入了一个无效的条目,程序将要求输入另一个整数,但当我运行它时,它不允许我输入和新的整数,只是多次打印无效条目。

  • 问题内容: 我想知道是否有这样一种方法来遍历java中每个循环的扩展扩展的多个集合。 所以像这样: 谢谢 问题答案: 您可以使用Guava的: