如何在 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 ]