Групповые значения в JSONata - PullRequest
0 голосов
/ 05 июня 2018

Есть ли возможность сгруппировать элементы по определенному атрибуту через JSONata

Например, группировка после json по значениям формы resultDate.

"Export": [
  {
    "code": "18724-100",
    "resultDate": "11.03.2018 13:11:48"
  },
  {
    "code": "18724-5",
    "resultDate": "11.03.2018 13:11:48"
  },
  {
    "code": "18724-99",
    "resultDate": "14.03.2018 14:11:48"
  }
]

Чтобы сгенерировать следующий вывод:

"Export": [
  {
    "resultDate": "11.03.2018 13:11:48",
    "codes": [
      {
        "code": "18724-100"
      },
      {
        "code": "18724-5"
      }
    ]
  },
  {
    "resultDate": "14.03.2018 13:11:48",
    "codes": [
      {
        "code": "18724-99"
      }
    ]
  }
]

Возможно, с помощью функции Reduction, которая группирует элементы, аналогичные описанным в этом сообщении в блоге.https://www.datchley.name/getting-functional-with-javascript-part-2/

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Для этого можно использовать следующее выражение:

{
  "Export": Export{resultDate: code[]} ~> $each(function($v, $k) {
    {
      "resultDate": $k,
      "codes": $v.{"code": $}
    }
  })
}

Первая часть Export{resultDate: code[]} группирует данные по resultDate, затем функция $each выполняет итерацию по парам имя / значение для получениявыход.Подобные выражения, вероятно, будут проще после добавления в язык функции $distinct (https://github.com/jsonata-js/jsonata/issues/117)

0 голосов
/ 05 июня 2018

Всякий раз, когда мне нужно сгруппировать некоторые объекты по общему свойству (например, resultDate), я создаю отдельный объект, используя значение этого свойства в качестве ключа, и удаляю это свойство из каждого из исходных объектов.Затем я использую функцию $spread(), чтобы разделить этот большой объект на массив объектов, каждый из которых имеет одно свойство.Последний шаг - заменить первый (и единственный) ключ каждого объекта исходным именем свойства.

Выражение JSONata для этого немного запутано:

{
    "Export": $spread(Export {
        resultDate: [
            $ ~> | $ | {}, "resultDate" |
        ]
    }).{
        "resultDate": $keys()[0],
        "codes": *
    }
}

Вы можетеПопробуйте сами, перейдя по ссылке на этот тренажер .

...