jq:数据去规范化



我有这个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);

谢谢!

这里有一个解决方案:

[(.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] }
]

最新更新