Mule 4:DW2 - 对象数组,按对象字段区分
Mule 4: DW2 - Array of objects, distinct by object field
我想要一个由特定字段区分的对象数组。
该数组已按此字段排序,因此确定要删除的字段应遵循以下内容:前一个字段的值应不同于该字段的当前值。
比如这个数组
[{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' )
但我需要当前项和先前项都存在才能确定当前项是新项(不等于先前项)。
您应该能够忽略数组已排序这一事实:您不需要知道当前值与先前值不同的便利。您可以使用 distinctBy
代替:
%dw 2.0
output application/json
var arr = [{A:'1',B:'1'},{A:'2',B:'2'},{A:'2',B:'3'}]
---
arr distinctBy $.A
Returns
[
{
"A": "1",
"B": "1"
},
{
"A": "2",
"B": "2"
}
]
如果您有兴趣,这里是 distinctBy
的文档:https://docs.mulesoft.com/mule-runtime/4.1/dw-core-functions-distinctby
我会给出一个更笼统的答案,它不仅可以通过 'A' 区分,而且可以通过 'B' 区分,因为如果只通过 [=24= 区分,问题的措辞并不清楚] 足够。尽管您的数据编织尝试仅通过 'A' 来区分,但您的示例只有两个相等的 A 并且没有两个相等的 B - 这是一种特定情况。
所以我假设没有两个 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)
。但这仅适用于 example(ii) 的情况,因为它将通过组合 A 和 B 来区分。Example(i) 和 example(iii) 将保持不变。 Example(iv) 将转换为 [{"A":'1',"B":'1'},{"A":'2',"B":'2'},{"A":'3',"B":'2'}]
。
- 因此,为了实现没有两个 A 相等且没有两个 B 相等的既定目标,我们必须首先按 'A' 区分,然后按 'B' 区分,然后找到公共重叠数组两者之间。所以我使用 filter 和 contains 来实现如下所示:
%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 $)
我想要一个由特定字段区分的对象数组。 该数组已按此字段排序,因此确定要删除的字段应遵循以下内容:前一个字段的值应不同于该字段的当前值。
比如这个数组
[{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' )
但我需要当前项和先前项都存在才能确定当前项是新项(不等于先前项)。
您应该能够忽略数组已排序这一事实:您不需要知道当前值与先前值不同的便利。您可以使用 distinctBy
代替:
%dw 2.0
output application/json
var arr = [{A:'1',B:'1'},{A:'2',B:'2'},{A:'2',B:'3'}]
---
arr distinctBy $.A
Returns
[
{
"A": "1",
"B": "1"
},
{
"A": "2",
"B": "2"
}
]
如果您有兴趣,这里是 distinctBy
的文档:https://docs.mulesoft.com/mule-runtime/4.1/dw-core-functions-distinctby
我会给出一个更笼统的答案,它不仅可以通过 'A' 区分,而且可以通过 'B' 区分,因为如果只通过 [=24= 区分,问题的措辞并不清楚] 足够。尽管您的数据编织尝试仅通过 'A' 来区分,但您的示例只有两个相等的 A 并且没有两个相等的 B - 这是一种特定情况。 所以我假设没有两个 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)
。但这仅适用于 example(ii) 的情况,因为它将通过组合 A 和 B 来区分。Example(i) 和 example(iii) 将保持不变。 Example(iv) 将转换为[{"A":'1',"B":'1'},{"A":'2',"B":'2'},{"A":'3',"B":'2'}]
。 - 因此,为了实现没有两个 A 相等且没有两个 B 相等的既定目标,我们必须首先按 'A' 区分,然后按 'B' 区分,然后找到公共重叠数组两者之间。所以我使用 filter 和 contains 来实现如下所示:
%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 $)