Сортировка массива правильная, но результат неверный с вложенным массивом.
Я пробовал с простым массивом, результат отсортирован правильно.
%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)))
})
Описание решения:
-
В токсичном выражении
item.products orderBy (...)
, мы используем операторdefault
, чтобы проверить наличие полейproduct
иproduct_ref
. Это позволяет правильно определить индекс в массивеsortOrder
для сортировки даже в случае, если поле называется иначе. - Мы изменяем код в
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
}
]
}
]
Теперь ваши вложенные массивы продуктов будут отсортированы в соответствии с заданным порядком, независимо от их имен полей.