我们必须从 Array1 中获取所有记录,并从 Array2 中获取最后匹配的记录。我尝试了 dataweave 中的 leftJoin 但它匹配 Array2 中的所有记录。
数组1:
[
{
"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
}
]
数组2:
[
{
"sid":123,
"postalCode": "67890",
"country": "USA"
},
{
"sid":456,
"postalCode": "54983",
"country": "UK"
},
{
"sid":123,
"postalCode": "27932",
"country": "EU"
}
]
这里 id=123 与 Array2 中的 2 条记录匹配,但我们必须获取最后一个匹配的记录。
预期输出:
[
{
"name": "Abc",
"address": "Mumbai",
"phone": "91-1234567891",
"id": 123,
"sid": 123,
"postalCode": "27932",
"country": "EU"
},
{
"name": "Pqr",
"address": "Pune",
"phone": "91-1234985438",
"id": 456,
"sid": 456,
"postalCode": "54983",
"country": "UK"
},
{
"name": "Abc",
"address": "Delhi",
"phone": "91-1234567891",
"id": 123,
"sid": 123,
"postalCode": "27932",
"country": "EU"
}
]
输出应具有与 Array1 中相同的记录数(即 3 条记录),并与 Array2 中的最后一个匹配记录匹配,即使出现 2 次也是如此。
我尝试了下面的 leftJoin,但我在输出中得到了超过 3 个匹配记录。
%dw 2.0
output application/json
import * from dw::core::Arrays
---
(leftJoin(Array1, Array2, (Array1) -> Array1.id, (Array2) -> Array2.sid)) map {
"name": $.l.name,
"address": $.l.address,
"phone": $.l.phone,
"id": $.l.id,
"sid": $.r.sid,
"postalCode": $.r.postalCode,
"country": $.r.country
}
问题是 Array2 中存在具有相同
sid
的重复元素,并且如果有多个选项,您希望使用 Array2 的最后一个可能的元素。您的脚本在这方面没有做任何事情。为了避免这些问题,我首先颠倒 Array2 的顺序,因此最后一个元素是第一个,然后使用 distinctBy()
删除重复项。我只是使用新排序的唯一数组来代替。
%dw 2.0
output application/json
import * from dw::core::Arrays
var Array1=[
{
"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
}
]
var Array2=[
{
"name": "Abc",
"address": "Mumbai",
"phone": "91-1234567891",
"id": 123,
"sid": 123,
"postalCode": "27932",
"country": "EU"
},
{
"name": "Pqr",
"address": "Pune",
"phone": "91-1234985438",
"id": 456,
"sid": 456,
"postalCode": "54983",
"country": "UK"
},
{
"name": "Abc",
"address": "Delhi",
"phone": "91-1234567891",
"id": 123,
"sid": 123,
"postalCode": "27932",
"country": "EU"
}
]
var Array2reversed=Array2[-1 to 0] distinctBy ((item, index) -> item.sid)
---
(leftJoin(Array1, Array2reversed, (Array1) -> Array1.id, (Array2) -> Array2.sid))
map {
"name": $.l.name,
"address": $.l.address,
"phone": $.l.phone,
"id": $.l.id,
"sid": $.r.sid,
"postalCode": $.r.postalCode,
"country": $.r.country
}
输出:
[
{
"name": "Abc",
"address": "Mumbai",
"phone": "91-1234567891",
"id": 123,
"sid": 123,
"postalCode": "27932",
"country": "EU"
},
{
"name": "Pqr",
"address": "Pune",
"phone": "91-1234985438",
"id": 456,
"sid": 456,
"postalCode": "54983",
"country": "UK"
},
{
"name": "Abc",
"address": "Delhi",
"phone": "91-1234567891",
"id": 123,
"sid": 123,
"postalCode": "27932",
"country": "EU"
}
]