日期/数字过滤器与jq

时间:2018-04-20 07:50:57

标签: json date filter jq

我有一个看起来像这样的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_nameroles数组内)的第一级对象,其值为HOUSE;
  • 并从该群组中仅选择至少有一个start日期为2017年或之后的人。

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

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

1 个答案:

答案 0 :(得分: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]

的缩写