2

私は次のjsonを持っています:

[
  {"id": "1", "type": "folder", "title": "folder-1"},
  {"id": "2", "type": "folder", "title": "folder-2"},
  {"id": "3", "type": "item", "title": "item-1", "folder": "1"},
  {"id": "4", "type": "item", "title": "item-2", "folder": "2"},
  {"id": "5", "type": "item", "title": "item-3"}
]

基本的に、jq を使用してこの出力を生成する必要があります。これは、SQL 結合の結果に似ています。

[
  {"type": "item", "title": "item-1", "folder": "folder-1"},
  {"type": "item", "title": "item-2", "folder": "folder-2"},
  {"type": "item", "title": "item-3"}
]

何か案は?

4

3 に答える 3

1

このフィルターを試してください:

map(
    (select(.type=="item") | { key: .folder, value: { type, title } }),
    (select(.type=="folder") | { key: .id, value: { folder: .title } })
)
| group_by(.key)
| map(
    (map(select(.key != null) | .value) | add)
    // map(.value)[]
)

これをいくつかのステップに分割する必要があります。

  1. アイテムとフォルダーを取得し、それぞれに関心のある値を取得し、関連付けるキーを割り当てます。

    map(
        (select(.type=="item") | { key: .folder, value: { type, title } }),
        (select(.type=="folder") | { key: .id, value: { folder: .title } })
    )
    
  2. キーですべてをグループ化する

    | group_by(.key)
    
  3. 次に、キー (フォルダー) を持つ値とそれ以外の値を結合します。

    | map(
        (map(select(.key != null) | .value) | add)
        // map(.value)[]
    )
    
于 2014-08-05T19:18:15.087 に答える
0
jq 'map(select(has("folder") or (.["title"] | startswith("item"))) | del(.id))' sample_file

出力:

[
  {
    "type": "item",
    "title": "item-1",
    "folder": "1"
  },
  {
    "type": "item",
    "title": "item-2",
    "folder": "2"
  },
  {
    "type": "item",
    "title": "item-3"
  }
]
于 2014-08-05T12:41:55.063 に答える