新对象中的 JSONata 分组

问题描述 投票:0回答:2

我正在寻找一种借助 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 最好地实现这一目标,这将有很大帮助。

问候

json grouping jsonata
2个回答
1
投票

您可以按

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


0
投票

这似乎有效,我觉得遵循起来更直观:

${
    (restaurantName & restaurantId): {
        "restaurantName": $[0].restaurantName,
        "restaurantId": $[0].restaurantId,
        "menu": $.$sift(function($_, $k){$k~>/^dish/})
    }
}.*

restaurantName
restaurantId
进行分组,我们映射每个组的名称和 ID,并挑选
dish*
属性来构建
menu
。然后映射到分组的值。

© www.soinside.com 2019 - 2024. All rights reserved.