将键与兄弟对象 JSONATA 匹配

Match keys with sibling object JSONATA

我有一个具有以下结构的 JSON 对象。当遍历 key_two 时,我想创建一个新对象,我将 return。 returned 对象应包含一个 title,其值来自 key_one 的名称,其中 key_one 的 ID 与来自 key_two 的当前循环节点相匹配。

这两个对象都包含其他键,这些键也将被包括在内,但我想不通的第一步是如何在循环时从兄弟对象中获取数据并将其与当前值匹配。

{
  "key_one": [
    {
      "name": "some_cool_title",
      "id": "value_one",
      ...
    }
  ],
  "key_two": [
    {
      "node": "value_one",
      ...
    }
  ],
}

我好像找到了解决办法。

[key_two].$filter($$.key_one, function($v, $k){
    $v.id = node
}).{"title": name ? name : id}

给出:

[
  {
    "title": "value_one"
  },
  {
    "title": "value_two"
  },
  {
    "title": "value_three"
  }
]

如果以后有人遇到类似问题,请将此留在这里。

这是 'join' 操作的一个很好的例子(在 SQL 术语中)。 JSONata 在路径表达式中支持这一点。参见 https://docs.jsonata.org/path-operators#-context-variable-binding

所以在你的例子中,你可以这样写:

key_one@$k1.key_two[node = $k1.id].{
    "title": $k1.name
}

然后,您可以通过引用任一原始对象中的项目,将额外的字段添加到生成的对象中。例如:

key_one@$k1.key_two[node = $k1.id].{
    "title": $k1.name,
    "other_one": $k1.other_data,
    "other_two": other_data
}

https://try.jsonata.org/--2aRZvSL