【问题标题】:Filter & sort array of objects then output only one property of each object过滤和排序对象数组,然后只输出每个对象的一个​​属性
【发布时间】:2021-04-08 12:30:18
【问题描述】:

我有 JSON,它以以下格式动态出现:

{
    "world": 583,
    "peace": [
        {
            "id": "Happy",
            "valid": true,
            "version": "9"
        },
        {
            "id": "Old",
            "valid": false,
            "version": "2020"
        },
        {
            "id": "New",
            "valid": true,
            "version": "2021"
        },
        {
            "id": "Year",
            "valid": true,
            "version": "5"
        }
    ]
}

我是 全新 jq,我已经阅读了教程和手册,以及 Stack Overflow 上的几个问题,包括: How to sort a json file by keys and values of those keys in jq

我想使用 jq 输出所有有效的 id ("valid"=true) 并按 id 排序输出。

所以在这个例子中,我希望输出是:

Happy
New
Year

到目前为止,我有:

jq '..|.peace[]|select(.valid)|=sort_by(.id)'

但这会引发 Cannot index string with string "id" 错误。

我怎样才能做到这一点?

谢谢你,新年快乐!

【问题讨论】:

    标签: arrays json sorting boolean jq


    【解决方案1】:

    保持.peace 数组完整以进行过滤和排序,然后脱离它:

    jq --raw-output '.peace | map(select(.valid).id) | sort[]' <f.json>
                     ^        ^                        ^   ^
                     A        B                        C   D
    

    地点:

    • 答:保持数组不变
    • B:映射 + 选择 = 过滤并仅保留 id
    • C:排序结果(即字符串列表(即id))
    • D:将每个项目从数组中“展开”
    • --raw-output 将输出为“文本”而不​​是字符串,例如Happy 而不是 "Happy"

    jq play fiddle 可用here.

    致谢:@peak 建议大大改进了这个答案

    【讨论】:

    • 我刚刚在完整数据集上运行了您慷慨提供的内容。它奏效了。谢谢你。现在我需要花一个小时研究你做了什么才能完全理解它。
    • 由于目标是按 .id 排序,因此首先提取 id 可能会更有效。作为附带福利,您可以获得更短的程序:jq -r '.peace | map(select(.valid).id) | sort[]'
    • @peak 谢谢。我不知道你可以在选择后立即阅读。同意这看起来确实更好。
    • select(.valid).id 只是 select(.valid) | .id 的缩写
    猜你喜欢
    • 2021-02-04
    • 2021-10-23
    • 1970-01-01
    • 1970-01-01
    • 2023-01-25
    • 2015-06-17
    • 2017-12-25
    • 1970-01-01
    • 2017-11-03
    相关资源
    最近更新 更多