如何在 Mule 4 的对象数组中 select 最后一个重复对象
How to select last duplicate object in array of objects in Mule 4
有一个重复对象数组(相同id),需要从中选择最后一个重复的对象。
输入:
{
"message": [
{
"name": "Abc",
"address":"Mumbai",
"phone":"91-1234567891",
"id":123
},
{
"name": "Pqr",
"address":"Pune",
"phone":"91-1234985438",
"id":456
},
{
"name": "Abc",
"address":"Delhi",
"phone":"91-1234567891",
"id":123
}
]
}
预期输出:
{
"message": [
{
"name": "Pqr",
"address": "Pune",
"phone": "91-1234985438",
"id": 456
},
{
"name": "Abc",
"address": "Delhi",
"phone": "91-1234567891",
"id": 123
}
]
}
在输出中,它应该取最后一个重复的对象值。我在 id 字段上尝试了 distinctBy 函数,但它从重复项中选择随机对象。
任何帮助,将不胜感激。谢谢。
您可以试试下面的DataWeave表达式:
%dw 2.0
output application/json
---
{
"message": payload.message groupBy ((item, index) -> item.id)
pluck ((value, key, index) -> value)
map ((item, index) -> item[sizeOf(item) - 1])
}
输入:
{
"message": [
{
"name": "Abc",
"address":"Mumbai",
"phone":"91-1234567891",
"id":123
},
{
"name": "Pqr",
"address":"Pune",
"phone":"91-1234985438",
"id":456
},
{
"name": "Abc",
"address":"Delhi",
"phone":"91-1234567891",
"id":123
}
]
}
输出:
{
"message": [
{
"name": "Abc",
"address": "Delhi",
"phone": "91-1234567891",
"id": 123
},
{
"name": "Pqr",
"address": "Pune",
"phone": "91-1234985438",
"id": 456
}
]
}
distinctBy
不是随机的——它将保留第一个实例并消除所有符合您的唯一性标准的后续条目。
如果您先反转数组,然后在 id
上执行 distinctBy
,您将删除除最后一个元素以外的所有元素。
试试这个:
%dw 2.0
output application/json
var data = {
"message": [
{
"name": "Abc",
"address":"Mumbai",
"phone":"91-1234567891",
"id":123
},
{
"name": "Pqr",
"address":"Pune",
"phone":"91-1234985438",
"id":456
},
{
"name": "Abc",
"address":"Delhi",
"phone":"91-1234567891",
"id":123
}
]
}
---
message: data.message[-1 to 0] distinctBy $.id
如果原来的顺序对您很重要,那么再次反转数组。表达式将如下所示:
message: (data.message[-1 to 0] distinctBy $.id)[-1 to 0]
Thies 是另一个同样的问题:
输入:
[
[
117、
112、
112
],
[
112、
113、
112
],
[
114、
112、
112
]
]
DW:
flatten(flatten(payload map ((key, index) -> {
ids:key 不同的$
})).ids) distinctBy $
输出:
[
117、
112、
113、
114
]
有一个重复对象数组(相同id),需要从中选择最后一个重复的对象。 输入:
{
"message": [
{
"name": "Abc",
"address":"Mumbai",
"phone":"91-1234567891",
"id":123
},
{
"name": "Pqr",
"address":"Pune",
"phone":"91-1234985438",
"id":456
},
{
"name": "Abc",
"address":"Delhi",
"phone":"91-1234567891",
"id":123
}
]
}
预期输出:
{
"message": [
{
"name": "Pqr",
"address": "Pune",
"phone": "91-1234985438",
"id": 456
},
{
"name": "Abc",
"address": "Delhi",
"phone": "91-1234567891",
"id": 123
}
]
}
在输出中,它应该取最后一个重复的对象值。我在 id 字段上尝试了 distinctBy 函数,但它从重复项中选择随机对象。 任何帮助,将不胜感激。谢谢。
您可以试试下面的DataWeave表达式:
%dw 2.0
output application/json
---
{
"message": payload.message groupBy ((item, index) -> item.id)
pluck ((value, key, index) -> value)
map ((item, index) -> item[sizeOf(item) - 1])
}
输入:
{
"message": [
{
"name": "Abc",
"address":"Mumbai",
"phone":"91-1234567891",
"id":123
},
{
"name": "Pqr",
"address":"Pune",
"phone":"91-1234985438",
"id":456
},
{
"name": "Abc",
"address":"Delhi",
"phone":"91-1234567891",
"id":123
}
]
}
输出:
{
"message": [
{
"name": "Abc",
"address": "Delhi",
"phone": "91-1234567891",
"id": 123
},
{
"name": "Pqr",
"address": "Pune",
"phone": "91-1234985438",
"id": 456
}
]
}
distinctBy
不是随机的——它将保留第一个实例并消除所有符合您的唯一性标准的后续条目。
如果您先反转数组,然后在 id
上执行 distinctBy
,您将删除除最后一个元素以外的所有元素。
试试这个:
%dw 2.0
output application/json
var data = {
"message": [
{
"name": "Abc",
"address":"Mumbai",
"phone":"91-1234567891",
"id":123
},
{
"name": "Pqr",
"address":"Pune",
"phone":"91-1234985438",
"id":456
},
{
"name": "Abc",
"address":"Delhi",
"phone":"91-1234567891",
"id":123
}
]
}
---
message: data.message[-1 to 0] distinctBy $.id
如果原来的顺序对您很重要,那么再次反转数组。表达式将如下所示:
message: (data.message[-1 to 0] distinctBy $.id)[-1 to 0]
Thies 是另一个同样的问题:
输入: [ [ 117、 112、 112 ], [ 112、 113、 112 ], [ 114、 112、 112 ] ]
DW:
flatten(flatten(payload map ((key, index) -> { ids:key 不同的$ })).ids) distinctBy $
输出: [ 117、 112、 113、 114 ]