【问题标题】:jq: How to select within a nested arrayjq:如何在嵌套数组中进行选择
【发布时间】:2020-08-31 21:41:22
【问题描述】:

我正在尝试在 jq 中选择对象子集的子集,同时保留外部对象。

以输入为例:

{
  "head": "master",
  "hash": "ba2054c38ec68b73926acb24cd0bad61177a03d4",
  "upstream": "origin/master",
  "ahead": 1,
  "behind": 0,
  "changes": [
    {
      "name": "exe/each-package",
      "status": "updated_in_index",
      "work_tree_status": "modified",
      "index_status": "unmodified"
    },
    {
      "name": "exe/find-package",
      "status": "not_updated",
      "work_tree_status": "unmodified",
      "index_status": "modified"
    },
    {
      "name": "lib/tools/tool_support.rb",
      "status": "not_updated",
      "work_tree_status": "unmodified",
      "index_status": "modified"
    },
    {
      "name": "curses.txt",
      "status": "untracked",
      "work_tree_status": "untracked",
      "index_status": "untracked"
    },
    {
      "name": "exe/fat-stat",
      "status": "untracked",
      "work_tree_status": "untracked",
      "index_status": "untracked"
    },
    {
      "name": "exe/prefix-each-with",
      "status": "untracked",
      "work_tree_status": "untracked",
      "index_status": "untracked"
    },
    {
      "name": "notes.txt",
      "status": "untracked",
      "work_tree_status": "untracked",
      "index_status": "untracked"
    }
  ]
}

以及我删除了changes 成员子集的预期输出:

{
  "head": "master",
  "hash": "ba2054c38ec68b73926acb24cd0bad61177a03d4",
  "upstream": "origin/master",
  "ahead": 1,
  "behind": 0,
  "changes": [
    {
      "name": "exe/each-package",
      "status": "updated_in_index",
      "work_tree_status": "modified",
      "index_status": "unmodified"
    },
    {
      "name": "exe/find-package",
      "status": "not_updated",
      "work_tree_status": "unmodified",
      "index_status": "modified"
    },
    {
      "name": "lib/tools/tool_support.rb",
      "status": "not_updated",
      "work_tree_status": "unmodified",
      "index_status": "modified"
    }
  ]
}

我能够做到以下几点。但我怀疑有一种更简洁的方法来过滤嵌套数组的内部结构,也许可以消除重复。

jq '. + {changes: [.changes[] | select(.status != "untracked")]}'

【问题讨论】:

    标签: json select jq


    【解决方案1】:

    更简洁可以通过以下方式实现:

    .changes |= map(select(.status != "untracked"))
    

    【讨论】:

    • 华丽!我喜欢它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-29
    • 2019-01-02
    • 2021-05-06
    • 1970-01-01
    • 2019-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多