首页 > 解决方案 > 如果多个键具有指定值,则使用 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
  }
]

标签: jsonjqrepeat

解决方案


为了实现有效的解决方案,让我们定义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")

推荐阅读