Dataweave - 全局唯一数组元素
Dataweave - Globally Unique Array Elements
您好,我有一个数据编织问题,我有示例输入,我想删除第二个数组中的第二个对象。简而言之,记录应该是全球唯一的。
我尝试了 distinct 和 filter,但是 filter 删除了两者,distinct 没有改变任何东西。
输入
[
{
"id": 1,
"books": [
{
"bookid": "1234",
"title": "C#"
},
{
"bookid": "5678",
"title": "Java"
}
]
},
{
"id": 2,
"books": [
{
"bookid": "4321",
"title": "VB"
},
{
"bookid": "5678",
"title": "Java"
}
]
}
]
输出
[
{
"id": 1,
"books": [
{
"bookid": "1234",
"title": "C#"
},
{
"bookid": "5678",
"title": "Java"
}
]
},
{
"id": 2,
"books": [
{
"bookid": "4321",
"title": "VB"
}
]
}
]
我假设我们会选择第一个独特的标题并丢弃其余的。下面我将您的问题分解为 4 个步骤。首先,我添加 id
和 books
,然后使用 distinctBy
删除重复项,然后按 id
对筛选列表进行分组,最后写下您想要的输出。我很想看看其他解决方案:)
%dw 2.0
output application/json
var globalList = payload flatMap ((item) -> (
item.books map (b) -> {id: item.id,(b)}))
distinctBy ((item) -> item.bookid)
groupBy ((item) -> item.id)
---
keysOf(globalList) map ((item) ->
{
id: item,
books: globalList[item] map ((book) -> book - 'id')
} )
与 Imtiyaz 的方法非常相似,只是更详细一些。
输入
[
{
"id": 1,
"books": [
{
"bookid": "1234",
"title": "C#"
},
{
"bookid": "5678",
"title": "Java"
}
]
},
{
"id": 2,
"books": [
{
"bookid": "4321",
"title": "VB"
},
{
"bookid": "1234",
"title": "Java"
}
]
},
{
"id": 3,
"books": [
{
"bookid": "4321",
"title": "VB"
},
{
"bookid": "5890",
"title": "Java"
}
]
}
]
脚本
%dw 2.0
output application/json
var allBookandIds = payload flatMap (value1,index1) -> (
value1.books map (value,index) -> {
a: {b: value1.id, (value)}
}.a
)
---
allBookandIds distinctBy($.bookid) groupBy($.b) mapObject {
id: ($$),
books: $ map {
bookid: $.bookid,
title: $.title
}
}
输出
{
"id": "1",
"books": [
{
"bookid": "1234",
"title": "C#"
},
{
"bookid": "5678",
"title": "Java"
}
],
"id": "2",
"books": [
{
"bookid": "4321",
"title": "VB"
}
],
"id": "3",
"books": [
{
"bookid": "5890",
"title": "Java"
}
]
}
您好,我有一个数据编织问题,我有示例输入,我想删除第二个数组中的第二个对象。简而言之,记录应该是全球唯一的。 我尝试了 distinct 和 filter,但是 filter 删除了两者,distinct 没有改变任何东西。
输入
[
{
"id": 1,
"books": [
{
"bookid": "1234",
"title": "C#"
},
{
"bookid": "5678",
"title": "Java"
}
]
},
{
"id": 2,
"books": [
{
"bookid": "4321",
"title": "VB"
},
{
"bookid": "5678",
"title": "Java"
}
]
}
]
输出
[
{
"id": 1,
"books": [
{
"bookid": "1234",
"title": "C#"
},
{
"bookid": "5678",
"title": "Java"
}
]
},
{
"id": 2,
"books": [
{
"bookid": "4321",
"title": "VB"
}
]
}
]
我假设我们会选择第一个独特的标题并丢弃其余的。下面我将您的问题分解为 4 个步骤。首先,我添加 id
和 books
,然后使用 distinctBy
删除重复项,然后按 id
对筛选列表进行分组,最后写下您想要的输出。我很想看看其他解决方案:)
%dw 2.0
output application/json
var globalList = payload flatMap ((item) -> (
item.books map (b) -> {id: item.id,(b)}))
distinctBy ((item) -> item.bookid)
groupBy ((item) -> item.id)
---
keysOf(globalList) map ((item) ->
{
id: item,
books: globalList[item] map ((book) -> book - 'id')
} )
与 Imtiyaz 的方法非常相似,只是更详细一些。
输入
[
{
"id": 1,
"books": [
{
"bookid": "1234",
"title": "C#"
},
{
"bookid": "5678",
"title": "Java"
}
]
},
{
"id": 2,
"books": [
{
"bookid": "4321",
"title": "VB"
},
{
"bookid": "1234",
"title": "Java"
}
]
},
{
"id": 3,
"books": [
{
"bookid": "4321",
"title": "VB"
},
{
"bookid": "5890",
"title": "Java"
}
]
}
]
脚本
%dw 2.0
output application/json
var allBookandIds = payload flatMap (value1,index1) -> (
value1.books map (value,index) -> {
a: {b: value1.id, (value)}
}.a
)
---
allBookandIds distinctBy($.bookid) groupBy($.b) mapObject {
id: ($$),
books: $ map {
bookid: $.bookid,
title: $.title
}
}
输出
{
"id": "1",
"books": [
{
"bookid": "1234",
"title": "C#"
},
{
"bookid": "5678",
"title": "Java"
}
],
"id": "2",
"books": [
{
"bookid": "4321",
"title": "VB"
}
],
"id": "3",
"books": [
{
"bookid": "5890",
"title": "Java"
}
]
}