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/1
和 select
表达式是正确的方法
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"
]
}
我有一个像这样的字符串:
"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/1
和 select
表达式是正确的方法
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"
]
}