json - 如果多个键具有指定值,则使用 jq 返回布尔值
问题描述
我有一个 JSON 斑点。它包含要处理的项目队列。我正在使用 jq 过滤它。此队列中的每个对象都有 key downloadId
。我可以使用此过滤器返回downloadId
具有特定值的对象列表:
.[] | select((.downloadId) == "ABCA01479FCAB77D0A8A5C499D5ABAA147E97B47")
但我真正需要的是一个布尔值,true
如果队列中有多个对象的值为downloadId
. 我一直在查看 jq 手册,但我不太确定该怎么做。我可以尝试使用any
any(.[]; .downloadId == "ABCA01479FCAB77D0A8A5C499D5ABAA147E97B47")
但如果该值有一个实例,则返回 true,不超过一个。
这是一个blob:
[
{
"sizeleft": 805679928.0,
"timeleft": "00:00:00",
"estimatedCompletionTime": "2019-05-03T17:30:31.370856Z",
"status": "Paused",
"trackedDownloadStatus": "Ok",
"statusMessages": [],
"downloadId": "1C2DE46A5B4258BE7AC47FEFAE71432897417126",
"id": 1065601863
},
{
"sizeleft": 836459293.0,
"timeleft": "00:00:00",
"estimatedCompletionTime": "2019-05-03T17:30:31.370864Z",
"status": "Paused",
"trackedDownloadStatus": "Ok",
"statusMessages": [],
"downloadId": "728084A13FD172FED437C6AE503A8CF4A8D317AE",
"id": 1177597916
},
{
"sizeleft": 836459293.0,
"timeleft": "00:00:00",
"estimatedCompletionTime": "2019-05-03T17:30:31.370864Z",
"status": "Paused",
"trackedDownloadStatus": "Ok",
"statusMessages": [],
"downloadId": "ABCA01479FCAB77D0A8A5C499D5ABAA147E97B47",
"id": 1177597916
}
]
解决方案
为了实现有效的解决方案,让我们定义repeated/2
检查给定值是否在流中多次出现:
def repeated(stream; $value):
label $done
| foreach stream as $x (0;
if $x == $value then . + 1 else . end;
if . == 2 then true, break $done else empty end)
// false;
这里的关键当然是在第二次遇到该值时跳出循环。
解决方案
有了上述,解决方案将是:
repeated(.[] | .downloadId; "ABCA01479FCAB77D0A8A5C499D5ABAA147E97B47")
推荐阅读
- swift - 具有非默认但仍为设备原生采样率的 AVAudioSinkNode
- javascript - 不活动时无法隐藏我的菜单
- python - 将 3D 图像堆叠到 4D
- sql - 使用Oracle异构服务从SQL Server拉取视图时,为什么有些字符串字段只有一个字符?
- node.js - 包 http 不包含在 React Native 和 Node 标准库中
- javascript - 从 Apps Script 中上传的文件中获取 Id
- c# - C# 表达式树 - 组合多个方法调用
- python-3.x - 最有效的方法
- sqlite - 丢失 ipython 历史记录 - 数据库锁定
- powershell - PowerShell:ConvertTo-SecureString 和 ConvertFrom-SecureString 在 PSSession 内的问题