Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 过滤及;对对象数组进行排序,然后只输出每个对象的一个属性_Arrays_Json_Sorting_Boolean_Jq - Fatal编程技术网

Arrays 过滤及;对对象数组进行排序,然后只输出每个对象的一个属性

Arrays 过滤及;对对象数组进行排序,然后只输出每个对象的一个属性,arrays,json,sorting,boolean,jq,Arrays,Json,Sorting,Boolean,Jq,我有JSON,它以以下格式动态呈现给我: { "world": 583, "peace": [ { "id": "Happy", "valid": true, "version": "9" }, {

我有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"
        }
    ]
}
我是全新的to,我已经阅读了教程和手册,以及这里关于堆栈溢出的几个问题,包括:

我想使用
jq
输出所有有效的id(
“valid”
=true),并按id对输出进行排序

因此,在本例中,我希望输出为:

Happy
New
Year
到目前为止,我已经:

jq'..|.peace[]选择(.valid)|=排序依据(.id)

但这会产生一个
无法用字符串“id”索引字符串的错误

我怎样才能做到这一点


谢谢你,新年快乐

保持
.peace
数组的完整性以进行筛选和排序,然后将其分离:

jq --raw-output '.peace | map(select(.valid).id) | sort[]' <f.json>
                 ^        ^                        ^   ^
                 A        B                        C   D
jq——原始输出“.peace |映射(选择(.valid).id)|排序[]”
^        ^                        ^   ^
A、B、C、D
其中:

  • A:保持阵列完整
  • B:map+select=filter&keep
    id
    only
  • C:排序结果(这是字符串列表(即ID))
  • D:“分散”阵列中的每个项目
  • --原始输出
    将输出为“文本”而不是字符串,例如
    快乐
    而不是
    快乐
jq可玩小提琴


确认:通过@peak suggestion

我刚刚在一个完整的数据集上运行了您慷慨提供的内容,这个答案得到了极大的改进。这是一种享受。非常感谢。现在,我需要花一个小时来研究您所做的工作,以完全理解它。因为目标是按.id排序,所以首先提取id可能会更有效一些。作为附带福利,您可以获得一个较短的程序:
jq-r'.peace | map(select(.valid).id)| sort[]”
@peak谢谢。我不知道你可以在选择后立即阅读。同意这看起来确实更好。
select(.valid).id
只是
select(.valid)|.id
@peak Done的缩写。多谢