JQ: денормализация данных - PullRequest
1 голос
/ 25 марта 2020

У меня есть это json:

{
  "headers": ["x", "y", "z"],
  "data": [1, 2, 3, 4, 5, 6, 7, 8, 9],
  "rows": ["a", "b", "c"]
}

, и я хотел бы закончить с этим:

[{
    "row": "a",
    "header": "x",
    "value": 1
}, {
    "row": "a",
    "header": "y",
    "value": 2
}, {
    "row": "a",
    "header": "z",
    "value": 3
}, {
    "row": "b",
    "header": "x",
    "value": 4
}, {
    "row": "b",
    "header": "y",
    "value": 5
}, {
    "row": "b",
    "header": "z",
    "value": 6
}, {
    "row": "c",
    "header": "x",
    "value": 7
}, {
    "row": "c",
    "header": "y",
    "value": 8
}, {
    "row": "c",
    "header": "z",
    "value": 9
}]

Как мне это сделать? Я возился с вложенным foreach, пока моя голова не взорвалась. JQ такой крутой, но такой другой. Вот как бы я это сделал в PHP:

$jsonString = '{
    "headers": ["x", "y", "z"],
    "data": [1, 2, 3, 4, 5, 6, 7, 8, 9],
    "rows": ["a", "b", "c"]
}';
$json = json_decode($jsonString);
$output = [];
$k = 0;
foreach($json->rows as $r) {
    foreach($json->headers as $h) {
        $p = new stdClass();
        $p->row = $r;
        $p->header = $h;
        $p->value = $json->data[$k];
        $output[] = $p;
        $k++;
    }
}
echo json_encode($output);

Спасибо!

1 Ответ

2 голосов
/ 25 марта 2020

Вот одно из решений:

[(.rows|length) as $n
 | (.headers|length) as $hl
 | range(0; $n) as $r
 | range(0; $hl) as $h
 | {row: .rows[$r],
    header: .headers[$h],
    value:  .data[$r * $hl + $h] }
]
...