【问题标题】:Mule 4: DW2 - Array of objects, distinct by object fieldMule 4:DW2 - 对象数组,按对象字段区分
【发布时间】:2019-03-29 14:19:16
【问题描述】:

我想要一个由某个字段区分的对象数组。 该数组已按此字段排序,因此确定要删除的字段应遵循以下内容:前一个字段的值应与该字段的当前值不同。

比如这个数组

[{A:'1',B:'1'},{A:'2',B:'2'},{A:'2',B:'3'}]

应该转换成

[{A:'1',B:'1'},{A:'2',B:'2'}]

我尝试了以下方法:

%dw 2.0
output application/json
var payload=[{A:'1',B:'1'},{A:'2',B:'2'},{A:'2',B:'3'}]
---
(payload map (  
    (a,i) ->   ( (a) if payload[i-1].A != $.A  ) 
))

但它不起作用。如果我不使用当前项目 ($),那么它会像这样工作

 (a,i) ->   ( (a) if payload[i-1].A != '2'  ) 

但我需要当前和以前的项目都存在,以确定当前项目是新的(不等于前一个)。

【问题讨论】:

    标签: distinct dataweave mule4


    【解决方案1】:

    您应该能够忽略数组已排序的事实:您不需要知道当前值与前一个值不同的便利。您可以改用distinctBy

    %dw 2.0
    output application/json
    
    var arr = [{A:'1',B:'1'},{A:'2',B:'2'},{A:'2',B:'3'}]
    ---
    arr distinctBy $.A
    

    返回

    [
      {
        "A": "1",
        "B": "1"
      },
      {
        "A": "2",
        "B": "2"
      }
    ]
    

    如果您有兴趣,这里是distinctBy 的文档:https://docs.mulesoft.com/mule-runtime/4.1/dw-core-functions-distinctby

    【讨论】:

      【解决方案2】:

      我将给出一个更一般的答案,该答案不仅可以通过“A”区分,而且可以通过“B”区分,因为在问题措辞中不清楚是否仅通过“A”区分就足够了。尽管您的数据编织尝试仅通过“A”来区分,但您的示例只有两个相等的 As 而没有两个相等的 B - 这是一种特定情况。 所以我会假设没有两个 As 应该相等,也没有两个 Bs 应该相等。

      一些具有所需输出的示例:

      Example(i): [{A:'1',B:'1'},{A:'2',B:'2'},{A:'3',B:'2'}] -> [{A:'1',B:'1'},{A:'2',B:'2'}]
      Example(ii): [{A:'1',B:'1'},{A:'2',B:'2'},{A:'2',B:'2'}] -> [{A:'1',B:'1'},{A:'2',B:'2'}] 
      Example(iii): [{A:'1',B:'1'},{A:'2',B:'2'},{A:'2',B:'3'}] -> [{A:'1',B:'1'},{A:'2',B:'2'}]
      Example(iv): [{"A":'1',"B":'1'},{"A":'2',"B":'2'},{"A":'3',"B":'2'},{"A":'2',"B":'2'}] ->  [{A:'1',B:'1'},{A:'2',B:'2'}]
      
      1. 人们可能会想arr distinctBy ($.A + $.B)。但这仅适用于示例(ii)的情况,因为它将通过组合 A 和 B 来区分。示例(i)和示例(iii)将保持不变。 Example(iv) 将转换为 [{"A":'1',"B":'1'},{"A":'2',"B":'2'},{"A":'3',"B":'2'}]
      2. 因此,为了实现既定的目标,即没有两个 A 相等,也没有两个 B 相等,我们必须先用“A”区分,然后用“B”区分,然后找到两者之间的公共重叠数组。所以我使用过滤器和包含来实现这一点,如下所示:
      %dw 2.0
      output application/json
      var arr = [{"A":'1',"B":'1'},{"A":'2',"B":'2'},{"A":'3',"B":'2'}]
      ---
      (arr distinctBy $.A) filter ((arr distinctBy $.B) contains $)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-28
        • 2018-09-09
        • 2023-01-25
        • 2011-05-16
        • 1970-01-01
        相关资源
        最近更新 更多