【问题标题】:date/numeric filter with jq带有 jq 的日期/数字过滤器
【发布时间】:2018-09-30 21:04:36
【问题描述】:

我有一个看起来像这样的 json(它是简单的 jq 过滤器的结果):

[{
    "name": "Corrine",
    "firstname": "Odile",
    "uid": "PA2685",
    "roles": [{
            "role_name": "GQ",
            "start": "2012-06-20"
        },
        {
            "role_name": "HOUSE",
            "start": "2012-06-26"
        },
        {
            "role_name": "HOUSE",
            "start": "2017-06-28"
        }
    ]
},
{
    "name": "Blanche",
    "firstname": "Matthieu",
    "uid": "PA2685",
    "roles": [{
            "role_name": "SENATE",
            "start": "2014-06-20"
        },
        {
            "role_name": "SENATE",
            "start": "2012-06-26"
        },
        {
            "role_name": "SENATE",
            "start": "2012-06-28"
        }
    ]
}
]

我想通过两种方式过滤:

  • 只选择至少有一个role_name(在roles数组内)值为HOUSE的第一级对象;
  • 并从该组中仅选择至少有一个 start 的日期在 2017 年或之后的组。

在上面的 json 中,“Corrine Odile”将是唯一一个被选中的。

我尝试了一些with_entries(select(.value 表达式,但我对如何处理日期以及“至少一个”要求感到困惑。

【问题讨论】:

  • 请遵循 mcve 指南stackoverflow.com/help/mcve。特别是,示例输入不是有效的 JSON,因此并不完全清楚“第一级对象”是什么。
  • 对不起,实际的 json 有数百行长,所以我只使用了开头而忘记放右大括号。现在修复了@peak

标签: json date filter jq


【解决方案1】:

使用any/2 通常可以有效地满足“至少一个”形式的要求,例如

any(.roles[]; .role_name == "HOUSE")

年度检查可以(显然)通过以下方式完成:

.start | .[:4] | tonumber >= 2017

解决方案

生成满足两个条件的对象数组:

map(select(
  any(.roles[]; .role_name == "HOUSE") and
  any(.roles[]; .start[:4] | tonumber >= 2017) ))

.start[:4].start|.[0:4] 的缩写

【讨论】:

  • 谢谢!太好了,我现在理解语法了。唯一的问题是关于 .[:4],它有什么作用?
  • 是.[0:4]的缩写;请参阅在线手册stedolan.github.io/jq/manual/#Basicfilters 的数组/字符串切片小节
猜你喜欢
  • 1970-01-01
  • 2018-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多