【问题标题】:Remove JSON element if key equals true (jq)如果键等于 true (jq),则删除 JSON 元素
【发布时间】:2023-01-24 01:40:35
【问题描述】:

给定 JSON:

[
  {
    "1": "false"
    "2": "true",
    "3": "true"
  },
  {
    "1": "false"
    "2": "false",
    "3": "false"
  },
  {
    "1": "true"
    "2": "true",
    "3": "true"
  }
]

给定数组作为传递给 jq 的参数:

["1","2","3"]

如果至少有一个键不是“真”,则需要使用 jq 工具删除 JSON 元素。

期望的输出:

[
  {
    "1": "false"
    "2": "true",
    "3": "true"
  },
  {
    "1": "true"
    "2": "true",
    "3": "true"
  }
]

给定 JSON:

[
  {
    "1": "false"
    "2": "true",
    "3": "true"
  },
  {
    "1": "false"
    "2": "false",
    "3": "false"
  },
  {
    "1": "true"
    "2": "true",
    "3": "true"
  }
]

给定数组作为传递给 jq 的参数:

["1","2","3"]

如果至少有一个键不是“真”,则需要使用 jq 工具删除 JSON 元素。

期望的输出:

[
  {
    "1": "false"
    "2": "true",
    "3": "true"
  },
  {
    "1": "true"
    "2": "true",
    "3": "true"
  }
]

【问题讨论】:

    标签: json jq


    【解决方案1】:

    我不知道参数 ["1","2","3"] 应该扮演什么角色,但除此之外,您可以使用 fromjson 将对象项从字符串转换为布尔值,然后适当地聚合它们,并在 map(select(…)) 子句中使用此结果过滤输入数组。

    现在,如果你想删除项目

    如果至少有一个键不是“真” 意味着你只想保留那些完全是true的,使用all聚合器:

    jq 'map(select(map(fromjson) | all))'
    
    [
      {
        "1": "true",
        "2": "true",
        "3": "true"
      }
    ]
    
    

    Demo

    但是,如果正如您想要的输出所建议的那样,您想要删除那些完全是 false 的项目,这意味着只保留那些至少有一个值是 true 的项目,请使用 any 聚合器:

    jq 'map(select(map(fromjson) | any))'
    
    [
      {
        "1": "false",
        "2": "true",
        "3": "true"
      },
      {
        "1": "true",
        "2": "true",
        "3": "true"
      }
    ]
    

    Demo

    【讨论】:

    • 我的猜测:数组参数是在决定对象是否具有真值时要关心的键列表。
    猜你喜欢
    • 1970-01-01
    • 2018-08-17
    • 1970-01-01
    • 1970-01-01
    • 2021-01-11
    • 1970-01-01
    • 1970-01-01
    • 2021-07-07
    • 1970-01-01
    相关资源
    最近更新 更多