我正在寻找一种借助 JSONata 将元素从平面层次结构分组为封装层次结构的解决方案。
鉴于我有以下输入数据:
[
{
"restaurantName": "Pizza Place",
"restaurantId": "1",
"dishName": "Margherita Pizza",
"dishId": "A"
},
{
"restaurantName": "Pizza Place",
"restaurantId": "1",
"dishName": "Four Cheese Pizza",
"dishId": "B"
},
{
"restaurantName": "Pizza Palace",
"restaurantId": "2",
"dishName": "Margherita Pizza",
"dishId": "A"
},
{
"restaurantName": "Pizza Palace",
"restaurantId": "2",
"dishName": "Four Cheese Pizza",
"dishId": "B"
},
{
"restaurantName": "Pizza Palace",
"restaurantId": "2",
"dishName": "Pepperoni Pizza",
"dishId": "C"
}
]
我想按餐厅将它们分组在一起,如下所示:
[
{
"restaurantName": "Pizza Place",
"restaurantId": "1",
"menu": [
{
"dishName": "Margherita Pizza",
"dishId": "A"
},
{
"dishName": "Four Cheese Pizza",
"dishId": "B"
}
]
},
{
"restaurantName": "Pizza Palace",
"restaurantId": "2",
"menu": [
{
"dishName": "Margherita Pizza",
"dishId": "A"
},
{
"dishName": "Four Cheese Pizza",
"dishId": "B"
},
{
"dishName": "Pepperoni Pizza",
"dishId": "C"
}
]
}
]
我已经尝试在 JSONata 练习器的帮助下找到解决方案,该解决方案似乎适用于减少的输入数据集,但一旦我使用完整的数据集(只是更多的餐馆和更多的菜肴),我就可以超时异常(可能是由于无限循环):
$distinct(
$map($distinct($), function($v0, $i, $a) {
{
"restaurantName":$v0.restaurantName,
"restaurantId": $v0.restaurantId,
"menu":$distinct($filter($$, function($v1,$i,$a) {$v1.restaurantId = $v0.restaurantId}).{
"dishName": dishName,
"dishId": dishId
})
}
})
)
如果有人有解决方案并解释如何使用 JSONata 最好地实现这一目标,这将有很大帮助。
问候
您可以按
restaurantId
分组为一个对象,然后使用 $each 函数迭代对象条目:
$${
restaurantId: $
} ~> $each(function($objects, $id) {{
"restaurantId": $id,
"restaurantName": $objects[0].restaurantName,
"menu": $objects.{
"dishName": dishName,
"dishId": dishId
}
}})
在 Stedi Playground 上查看:https://stedi.link/qJhXW0h
这似乎有效,我觉得遵循起来更直观:
${
(restaurantName & restaurantId): {
"restaurantName": $[0].restaurantName,
"restaurantId": $[0].restaurantId,
"menu": $.$sift(function($_, $k){$k~>/^dish/})
}
}.*
按
restaurantName
和 restaurantId
进行分组,我们映射每个组的名称和 ID,并挑选 dish*
属性来构建 menu
。然后映射到分组的值。