Как получить максимальное значение от JSON? - PullRequest
0 голосов
/ 02 февраля 2019

Существует файл json, подобный этому:

[
{
    "createdAt": 1548729542000,
    "platform": "foo"
},
{
    "createdAt": 1548759398000,
    "platform": "foo"
},
{
    "createdAt": 1548912360000,
    "platform": "foo"
},
{
    "createdAt": 1548904550000,
    "platform": "bar"
}
]

Теперь я хочу получить максимум созданного на платформе foo?как реализовать это с помощью jq?

jq '.[] | select(.platform=="foo") | .createdAt | max' foo.json
jq: error (at <stdin>:17): number (1548729542000) and number (1548729542000) cannot be iterated over

jq '.[] | select(.platform=="foo") | max_by(.createdAt)' foo.json
jq: error (at <stdin>:17): Cannot index number with string "createdAt"
exit status 5

Ответы [ 2 ]

0 голосов
/ 02 февраля 2019

Один из подходов состоит в том, чтобы сделать выбор, а затем использовать одну из ориентированных на массив встроенных функций max или max_by, чтобы найти максимум, например

map(select(.platform=="foo"))
| max_by(.createdAt)
| .createdAt

Однако этот подход не оченьудовлетворительно, так как требует больше места, чем строго необходимо.Для больших массивов лучше подойдет потоковая версия max_by.

max_by

def max_by(s; f):
  reduce s as $s (null;
    if . == null then {s: $s, m: ($s|f)}
    else  ($s|f) as $m
    | if $m > .m then {s: $s, m: $m} else . end
    end)
  | .s ;

max_by(.[] | select(.platform=="foo"); .createdAt)
| .createdAt
0 голосов
/ 02 февраля 2019
Вход

max должен быть массивом.

$ jq '[ .[] | select(.platform == "foo").createdAt ] | max' file
1548912360000
...