ule子4:DW2-对象数组,按对象字段不同

时间:2019-03-27 22:46:38

标签: distinct dataweave mule4

我想要一个由特定字段区分的对象数组。 该数组已经按此字段排序,因此要标识要删除的字段应遵循以下条件:前一个字段的值应与该字段的当前值不同。

例如,该数组

[{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'  ) 

但是我需要显示当前和以前的项目,以确定当前项目是新的(不等同于先前的项目)。

2 个答案:

答案 0 :(得分:2)

您应该能够忽略对数组进行排序的事实:您不需要知道当前值与之前的值不同就不需要麻烦。您可以改用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

答案 1 :(得分:0)

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

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

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. 因此,要实现既没有两个As相等又没有两个B相等的既定目标,我们必须首先以'A'区分,然后以'B'区分,然后找到两者之间的公共重叠数组。因此,我正在使用filter并包含实现以下目标的方法:
%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 $)