【问题标题】:How to select last duplicate object in array of objects in Mule 4如何在 Mule 4 的对象数组中选择最后一个重复对象
【发布时间】:2021-10-06 19:32:51
【问题描述】:

有一个重复对象数组(相同 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 mulesoft mule4 mule-esb


    【解决方案1】:

    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]
    

    【讨论】:

      【解决方案2】:

      您可以尝试以下 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
          }
        ]
      }
      

      【讨论】:

      • 谢谢@olamiral,它按预期工作。
      【解决方案3】:

      这是另一个相同的问题:

      输入: [ [ 117, 112, 112 ], [ 112, 113, 112 ], [ 114, 112, 112 ] ]

      德国之声:

      flatten(flatten(payload map ((key, index) -> { ids:key distinctBy $ })).ids) distinctBy $

      输出: [ 117, 112, 113, 114 ]

      【讨论】:

        猜你喜欢
        • 2022-11-14
        • 2021-01-01
        • 1970-01-01
        • 2017-01-28
        • 2015-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多