Сортировка вложенного массива с использованием конкретного списка в DataWeave

Вопросы и ответы

Сортировка массива правильная, но результат неверный с вложенным массивом.

Я пробовал с простым массивом, результат отсортирован правильно.

%dw 2.0
output application/json
import indexOf from dw::core::Arrays
var sortOrder=["P_A", "P_B"]
var myInput=[
            {
                "product": "P_B",
                "price": 12
            },
            {
                "product": "P_A",
                "price": 21
            }
        ]
---
myInput orderBy( indexOf(sortOrder, $.product))

Вывод:

[
{
“product”: “P_A”,
“price”: 21
},
{
“product”: “P_B”,
“price”: 12
}
]

Но когда я пытаюсь с вложенным массивом, вывод совсем не отсортирован.

%dw 2.0
output application/json
import indexOf from dw::core::Arrays
var sortOrder=["P_A", "P_B"]
var myInput=[
    {
        "command": "AZ59696",
        "products": [
            {
                "product": "P_B",
                "price": 12
            },
            {
                "product": "P_A",
                "price": 21
            }
        ]
    },
    {
        "command": "BA23122",
        "products": [
            {
                "product_ref": "P_A",
                "price": 21
            },
            {
                "product_ref": "P_B",
                "price": 12
            }
        ]
    }
]
---

myInput map ((item, index) -> item  update {
    case .item.products -> item.products orderBy( indexOf(sortOrder, $.product))
})

Вывод:

[
{
“command”: “AZV59696”,
“products”: [
{
“product”: “P_B”,
“price”: 12
},
{
“product”: “P_A”,
“price”: 21
}
]
},
{
“command”: “BA2322”,
“products”: [
{
“product_ref”: “P_A”,
“price”: 21
},
{
“product_ref”: “P_B”,
“price”: 12
}
]
}
]

Что не так?

Ответ

Ваша проблема заключается в том, что вы пытаетесь отсортировать вложенный массив объектов по полю product, но в одном из объектов используется другое имя поля (product_ref). Поэтому текущая сортировка не работает должным образом.

Для решения этой проблемы вам необходимо использовать условие для определения, какое поле использовать для сортировки. Вот исправленный код DataWeave, который корректно сортирует вложенный массив продуктов по вашему заданному порядку.

%dw 2.0
output application/json
import indexOf from dw::core::Arrays

var sortOrder = ["P_A", "P_B"]
var myInput = [
    {
        "command": "AZ59696",
        "products": [
            {
                "product": "P_B",
                "price": 12
            },
            {
                "product": "P_A",
                "price": 21
            }
        ]
    },
    {
        "command": "BA23122",
        "products": [
            {
                "product_ref": "P_A",
                "price": 21
            },
            {
                "product_ref": "P_B",
                "price": 12
            }
        ]
    }
]

---
myInput map ((item) -> item update {
    case .products -> 
        // Сортируем вложенные продукты с учетом возможности двух различных полей
        item.products orderBy (indexOf(sortOrder, $.product default indexOf(sortOrder, $.product_ref)))
})

Описание решения:

  1. В токсичном выражении item.products orderBy (...), мы используем оператор default, чтобы проверить наличие полей product и product_ref. Это позволяет правильно определить индекс в массиве sortOrder для сортировки даже в случае, если поле называется иначе.

  2. Мы изменяем код в orderBy на indexOf(sortOrder, $.product default indexOf(sortOrder, $.product_ref)), что означает, что если product не найден, мы проверяем product_ref.

Ожидаемый вывод:

После применения этого изменения, вы получите правильный результат при сортировке вложенных массивов:

[
    {
        "command": "AZ59696",
        "products": [
            {
                "product": "P_A",
                "price": 21
            },
            {
                "product": "P_B",
                "price": 12
            }
        ]
    },
    {
        "command": "BA23122",
        "products": [
            {
                "product_ref": "P_A",
                "price": 21
            },
            {
                "product_ref": "P_B",
                "price": 12
            }
        ]
    }
]

Теперь ваши вложенные массивы продуктов будут отсортированы в соответствии с заданным порядком, независимо от их имен полей.

Оцените материал
Добавить комментарий

Капча загружается...