JSONata 中的组值

Group Values in JSONata

是否可以通过 JSONata 按特定属性对项目进行分组

例如,按照 resultDate 中的值对 json 进行分组。

"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 函数对与此博客中描述的相似的元素进行分组 post。 https://www.datchley.name/getting-functional-with-javascript-part-2/

每当我需要按公共 属性(如 resultDate)对某些对象进行分组时,我会使用 属性 的值作为键来创建一个对象,然后删除属性 来自每个原始对象。然后我使用 $spread() 函数将那个大对象拆分为一个对象数组,每个对象都有一个 属性。最后一步是用原始 属性 名称替换每个对象的第一个(也是唯一一个)键。

执行此操作的 JSONata 表达式有点复杂:

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

您可以前往 this exerciser link 亲自尝试。

以下表达式可用于此:

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

第一部分 Export{resultDate: code[]}resultDate 对数据进行分组,然后 $each 函数迭代 name/value 对以生成输出。一旦将 $distinct 函数添加到语言 (https://github.com/jsonata-js/jsonata/issues/117)

中,这样的表达式可能会更容易

另一种一般分组方式是:

  1. 使用要分组的键创建结果结构
  2. 之后取值数组

PS。我喜欢 Andrew Coleman 不过回答更好

所以对于这个问题,应该是这样的:

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