JSONata - Дублирующиеся объекты в массиве на основе общего значения - PullRequest
0 голосов
/ 29 февраля 2020

Это случай использования электронной коммерции, когда мне нужно потреблять все заказы за день, составлять один заголовок заказа и составлять сводную сводку по отдельным позициям. Это означает, что мне нужно дедуплицировать массив объектов линейных позиций на основе общего значения (sku). Мне также нужно суммировать определенные поля (количество, общая стоимость покупки) на основе того же значения.

Пример ввода:

{
  "Account": {
    "Account Name": "Firefly",
    "Order": [
      {
        "OrderID": "order103",
        "Product": [
          {
            "Product Name": "Bowler Hat",
            "ProductID": 858383,
            "SKU": "0406654608",
            "Description": {
              "Colour": "Purple",
              "Width": 300,
              "Height": 200,
              "Depth": 210,
              "Weight": 0.75
            },
            "Price": 50.0,
            "Quantity": 2
          },
          {
            "Product Name": "Trilby hat",
            "ProductID": 858236,
            "SKU": "0406634348",
            "Description": {
              "Colour": "Orange",
              "Width": 300,
              "Height": 200,
              "Depth": 210,
              "Weight": 0.6
            },
            "Price": 21.67,
            "Quantity": 1
          }
        ]
      },
      {
        "OrderID": "order104",
        "Product": [
          {
            "Product Name": "Bowler Hat",
            "ProductID": 858383,
            "SKU": "040657863",
            "Description": {
              "Colour": "Purple",
              "Width": 300,
              "Height": 200,
              "Depth": 210,
              "Weight": 0.75
            },
            "Price": 100,
            "Quantity": 4
          },
          {
            "ProductID": 345664,
            "SKU": "0406654603",
            "Product Name": "Cloak",
            "Description": {
              "Colour": "Black",
              "Width": 30,
              "Height": 20,
              "Depth": 210,
              "Weight": 2
            },
            "Price": 107.99,
            "Quantity": 1
          }
        ]
      }
    ]
  }
}

Желаемый вывод:

{
  "header": "Some Header Fields...",
  "line items": [
    {
      "Product Name": "Bowler Hat",
      "ProductID": 858383,
      "SKU": "0406654608",
      "Description": {
        "Colour": "Purple",
        "Width": 300,
        "Height": 200,
        "Depth": 210,
        "Weight": 0.75
      },
      "Price": 150,
      "Quantity": 6
    },
    {
      "Product Name": "Trilby hat",
      "ProductID": 858236,
      "SKU": "0406634348",
      "Description": {
        "Colour": "Orange",
        "Width": 300,
        "Height": 200,
        "Depth": 210,
        "Weight": 0.6
      },
      "Price": 21.67,
      "Quantity": 1
    },
    {
      "ProductID": 345664,
      "SKU": "0406654603",
      "Product Name": "Cloak",
      "Description": {
        "Colour": "Black",
        "Width": 30,
        "Height": 20,
        "Depth": 210,
        "Weight": 2
      },
      "Price": 107.99,
      "Quantity": 1
    }
  ]
}

Я знаю, что могу получить массив skus, используя $ Different (), но я не могу понять, как создать совершенно разные объекты с сохранением их значений.

Я не думаю, что смогу применить слияние, потому что некоторые части (кол-во) объекта не являются уникальными, и я не могу понять, как объединить только определенные поля внутри самого объекта.

Наконец, я работаю на платформе, в которой нет кода фрагменты, так что я не могу позвонить javascript. Это возможно в чистом JSONata?

1 Ответ

0 голосов
/ 04 марта 2020

Найдена группировка документации. Мне удалось сгруппировать по sku, используя $ lineItems: = Account.Order.Product {SKU: {"price": $ sum (Price), "qty": $ sum (Количество), "sku": $ Different (SKU) }}

Это генерирует узел с каждым ключом, являющимся SKU, поэтому я отображаю "output_line_items": $ lineItems. *, Который дает мне записи под каждым полем sku.

Примечание в моем примере SKU на самом деле не совпадают по продуктам, ProductID был бы лучшим примером. Но SKU был использован для моего конкретного c варианта использования.

...