我想要一个由特定字段区分的对象数组。 该数组已经按此字段排序,因此要标识要删除的字段应遵循以下条件:前一个字段的值应与该字段的当前值不同。
例如,该数组
[{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' )
但是我需要显示当前和以前的项目,以确定当前项目是新的(不等同于先前的项目)。
答案 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'}]
arr distinctBy ($.A + $.B)
。但这仅在示例(ii)的情况下有效,因为它将通过组合的A和B来区分。示例(i)和示例(iii)将保持不变。 Example(iv)将转换为[{"A":'1',"B":'1'},{"A":'2',"B":'2'},{"A":'3',"B":'2'}]
。 %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 $)