JSONata中的组值

时间:2018-06-05 09:44:42

标签: jsonata

是否有可能通过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/

3 个答案:

答案 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)

然而,另一种通常的分组方式是:

  1. 使用分组依据的键创建结果结构
  2. 此后取值数组

PS。我更喜欢 Andrew Coleman 回答

因此,对于这个问题,它将是这样的:

${
    resultDate: {
        "resultDate": $distinct(resultDate),
        "codes": code.{"code": $}
    }
} ~> $each(function($v){$v})