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 个步骤。首先,我添加 idbooks,然后使用 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"
    }
  ]
}