json JQ:检查数组中是否存在key的子串

h22fl7wq  于 2023-04-08  发布在  其他
关注(0)|答案(2)|浏览(164)

我有一个对象数组作为输入,每个对象如下所示:

{
  "downloadDir": "/merge/downloads",
  "id": 2485,
  "labels": [
    "irrelevant",
    "downloads"
  ]
}

我试图让JQ遍历每个对象,并找到那些在.labels数组中没有元素的对象,该元素是.downloadDir在第1个和第2个'/'之间的子字符串,即。

  • 对于“/merge/downloads”,它应该是“downloads”
  • 对于“/merge/tv/downloads”,它应该是“tv”
  • 对于“/merge/tv-share/downloads”,它应该是“tv-share”

对于匹配的对象,它应该返回它们的. id。
在回顾了Stack Overflow上的一些类似问题后,我认为逻辑应该是这样的:Map(选择(.labels|index(.downloadDir)))。如果我在index()中有一个静态字符串,如map(select(.labels|index(“downloads”))),但是我无法让它与.downloadDir一起工作:它抛出“Cannot index array with string“downloadDir””或“Cannot index string with string“labels”“,这取决于我是否将输入作为数组传递。
我完全不确定如何将正则表达式应用于.downloadDir以从中获取所需的子字符串。

jogvjijk

jogvjijk1#

使用/"/"处拆分.downloadDir,并获取第二个项目。将其与.labels中的每个项目进行比较,如果至少有一个(any)匹配,则产生trueselect这些项目,并输出.id

jq 'select(any(.labels[] == (.downloadDir / "/")[2]; .)).id ' input.json
2485

Demo
如果你的输入确实是一个元素数组,那么就在前面加上.[]

eaf3rand

eaf3rand2#

我在输入中添加了一个对象进行测试:

[{
  "downloadDir": "/merge/downloads",
  "id": 2485,
  "labels": [
    "irrelevant",
    "downloads"
  ]
},{
  "downloadDir": "/merge/tv/downloads",
  "id": 2486,
  "labels": [
    "irrelevant",
    "downloads"
  ]
}]

下面的表达式返回第一个对象的id,而不是第二个:

<file.json jq '.[]
               | (.downloadDir | split("/")[2]) as $key
               | select(.labels | map(. != $key) | all).id'

相关问题