Как остановить фильтр JQ от сопоставления ключа для каждой перестановки других ключей - PullRequest
0 голосов
/ 08 октября 2018

Я пытаюсь проанализировать коллекцию объектов JSON, например:

{
"stage": [
{
"name": "Stage 1",
"weeks": [
{
 "name": "Week 1",
 "matches": [
  {
   "teams": [
    {
     "name": "San Francisco Shock",
     "score": "0",
     "score_url": "https://overwatchleague.com/matches/10223"
    },
    {
     "name": "Los Angeles Valiant",
     "score": "4",
     "score_url": "https://overwatchleague.com/matches/10223"
    }
   ]
  },
  {
   "teams": [
    {
     "name": "Shanghai Dragons",
     "score": "0",
     "score_url": "https://overwatchleague.com/matches/10224"
    },
    {
     "name": "Los Angeles Gladiators",
     "score": "4",
     "score_url": "https://overwatchleague.com/matches/10224"
    }
   ]
  },
  {
   "teams": [
    {
     "name": "Dallas Fuel",
     "score": "1",
     "score_url": "https://overwatchleague.com/matches/10225"
    },
    {
     "name": "Seoul Dynasty",
     "score": "2",
     "score_url": "https://overwatchleague.com/matches/10225"
    }
   ]
  },

и т. Д. И т. Д.

Я пытаюсь перевести это в другой формат,не является супер дружественным к JSON, с ним легче справиться, сжав его примерно так:

{"matches":
    [
     {
      "team1": "San Francisco Shock",
      "t1score": "0",
      "team2": "Los Angeles Valiant",
      "t2score": "4"
     },
     { ... }
    ]
}

Я пытаюсь использовать этот фильтр jq для достижения этой цели:

jq '.stage[] | {matches: [{team1: .weeks[].matches[].teams[0].name, t1score: 
.weeks[].matches[].teams[0].score, team2: .weeks[].matches[].teams[1].name, 
t2score: .weeks[].matches[].teams[1].score}]}'

Проблема заключается в том, что он сопоставляет каждый экземпляр, скажем, ключа «имя» со значением «Шок Сан-Франциско» со всеми перестановками баллов и имен в массиве «совпадения».Я довольно новичок в jq, но я думаю, что это происходит, потому что я просто говорю ему отображать все элементы в «неделях» и «совпадениях» вместе через фильтр.Это правильно?И как будет выглядеть фильтр, который на самом деле делает то, что я пытаюсь попробовать?Я не нашел простого способа не допустить совпадения фильтра за пределами массива "groups".

1 Ответ

0 голосов
/ 08 октября 2018

Хитрость заключается в том, чтобы «тянуть» итератор .weeks[] вперед и к map по массиву .matches:

.stage[]
|.weeks[]
| {matches:
    (.matches
     | map({team1:   .teams[0].name,
            t1score: .teams[0].score,
            team2:   .teams[1].name, 
            t2score: .teams[1].score }) ) }

Вывод

{
  "matches": [
    {
      "team1": "San Francisco Shock",
      "t1score": "0",
      "team2": "Los Angeles Valiant",
      "t2score": "4"
    },
    {
      "team1": "Shanghai Dragons",
      "t1score": "0",
      "team2": "Los Angeles Gladiators",
      "t2score": "4"
    },
    {
      "team1": "Dallas Fuel",
      "t1score": "1",
      "team2": "Seoul Dynasty",
      "t2score": "2"
    }
  ]
}
...