是否有可能通过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"
}
]
}
]
也许使用reduce函数将类似于此博客文章中描述的元素分组。 https://www.datchley.name/getting-functional-with-javascript-part-2/
答案 0 :(得分:2)
每当我需要通过公共属性(如resultDate
)对某些对象进行分组时,我使用该属性的值作为键创建单个对象,并从每个原始对象中删除该属性。然后我使用$spread()
函数将该大对象拆分为一个对象数组,每个对象都有一个属性。最后一步是用原始属性名替换每个对象的第一个(也是唯一的)键。
执行此操作的JSONata表达式有点复杂:
{
"Export": $spread(Export {
resultDate: [
$ ~> | $ | {}, "resultDate" |
]
}).{
"resultDate": $keys()[0],
"codes": *
}
}
您可以转到this exerciser link。
自行尝试答案 1 :(得分:1)
以下表达式可用于此:
{
"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)
答案 2 :(得分:0)
然而,另一种通常的分组方式是:
PS。我更喜欢 Andrew Coleman 回答
因此,对于这个问题,它将是这样的:
${
resultDate: {
"resultDate": $distinct(resultDate),
"codes": code.{"code": $}
}
} ~> $each(function($v){$v})