JQ — Return 第一个满足谓词的元素

JQ — Return first element that satisfies a predicate

我有一个像这样的字符串:

"The sky is blue."

和一个 JSON 文件,如

[
  {
    "id": 1234,
    "name": "Entry 1",
    "keywords": [
      "orange",
      "yellow"
    ]
  }, 
  {
    "id": 2345,
    "name": "Entry 2",
    "keywords": [
      "red",
      "blue",
      "pink"
    ]
  }, 
  {
    "id": 3456,
    "name": "Entry 3",
    "keywords": [
        "green",
        "blue",
        "black"
    ]
  }
]

我想return第一个有关键字的元素可以在字符串中找到。

在这种情况下,我希望元素具有 ID 2345,因为关键字 "blue" 出现在字符串中,并且是第一个匹配项。

有JQ的单线解决方案吗(比如各种管道)?我不是在寻找循环解决方案。

input.json

中加上以上内容

查询:

 jq '.[] | {id, keywords: .keywords[]} | select(.keywords == "blue") ' input.json

输出:

{
  "id": 2345,
  "keywords": "blue"
}
{
  "id": 3456,
  "keywords": "blue"
}

你可以从这里得到第一个对象。

在这里使用 first/1select 表达式是正确的方法

jq --arg v "The sky is blue." 'first(.[] | select(.keywords as $k | $v | match($k[])))'

产生

{
  "id": 2345,
  "name": "Entry 2",
  "keywords": [
    "red",
    "blue",
    "pink"
  ]
}

基于 Inian 出色答案的变体:

first(.[] | select(.keywords | any(inside("the sky is blue."))))

如果我们在 input.json 中有数据并且字符串 "the sky is blue." 作为参数传递,我们有:

jq --arg str 'the sky is blue' 'first(.[] | select(.keywords | any(inside($str))))' input.json

此returns关键字包含在$str中的第一个元素:

{
  "id": 2345,
  "name": "Entry 2",
  "keywords": [
    "red",
    "blue",
    "pink"
  ]
}