json 下面的jq食谱可以简化吗

pb3s4cty  于 5个月前  发布在  其他
关注(0)|答案(2)|浏览(53)

使用jq版本1.5,我需要根据嵌套对象中的值有条件地输出一些json对象(在数组中)。我在StackOverflow上查看了这里,并设法获得了我想要的工作,但我想知道它是否可以简化。这是我的数据。

{
  "data": [
    {
      "name": "Rich",
      "age": 10
    },
    {
      "name": "Michael",
      "age": 11
    },
    {
      "name": "Victoria",
      "age": 8
    },
    {
      "name": "Philip",
      "age": 9
    }
  ]
}

字符串
我需要复制相同的结构,但只针对10岁或以上的学生,因此输出应该如下所示:

{
  "data": [
    {
      "name": "Rich",
      "age": 10
    },
    {
      "name": "Michael",
      "age": 11
    }
  ]
}


下面的代码实现了我想要的:

.data | to_entries | map(select(.value.age>9)) | [.[].value] | {data: .}


但是我在jq手册中读到with_entries可以用来替换to_entries-> map-> from_entries,现在我没有使用from_entries,但是它让我怀疑我是否应该这样做,以及这是否意味着我不需要在最后两个管道中手动重新创建我的数组和对象。
这是解决这类问题的最佳方法吗?
我试着在我的map之后使用from_entries,看看它是否能满足我的需要,但我得到了一个错误:

jq: error (at <stdin>:19): Cannot use number (0) as object key


所以我对它的理解是不正确的。

tvmytwxo

tvmytwxo1#

.data |= map(select(.age >= 10))

字符串
将以一种更干净的方式产生与您在this online demo中测试的相同的输出。
使用|=更新赋值来更新.data的值。

ds97pgxw

ds97pgxw2#

你已经有了一个数组,所以你不需要先转换为条目。只需map数组和select所需的元素:

.data |= map(select(.age >= 10))

字符串
替代地

.data | { data: map(select(.age >= 10)) }


{ data: (.data | map(select(.age >= 10))) }


在数组上调用to_entries将给予一个新的数组,它带有一个键值对象,键是索引:

[
  {
    "key": 0,
    "value": {
      "name": "Rich",
      "age": 10
    }
  },
  ...
]


因此,除非你的条件需要对索引执行计算(比如,选择每三个元素,或者只选择那些是5的倍数的索引),否则这里不需要to_entries

相关问题