我有一个带有两个数组的JSON文件。我想将这些数组组合成单个对象数组,每个对象都包含每个原始数组中的一个元素。
JSON输入如下所示:
{
"en": [
"E1",
"E2",
"E3",
"E4"
],
"fr": [
"F1",
"F2",
"F3",
"F4"
]
}
所需的输出:
[
{ "en":"E1", "fr":"F1"},
{ "en":"E2", "fr":"F2"},
{ "en":"E3", "fr":"F3"},
{ "en":"E4", "fr":"F4"}
]
无论我如何尝试,我都无法驯服jq来实现这一目标。我最近来的是使用过滤器. | {en:.en[],fr:.fr[]}
,它为我提供了数组的所有可能配对,如下所示:
{
"en": "E1",
"fr": "F1"
}
{
"en": "E1",
"fr": "F2"
}
{
"en": "E1",
"fr": "F3"
}
{
"en": "E1",
"fr": "F4"
}
{
"en": "E2",
"fr": "F1"
}
{
"en": "E2",
"fr": "F2"
}
{
"en": "E2",
"fr": "F3"
}
{
"en": "E2",
"fr": "F4"
}
{
"en": "E3",
"fr": "F1"
}
{
"en": "E3",
"fr": "F2"
}
{
"en": "E3",
"fr": "F3"
}
{
"en": "E3",
"fr": "F4"
}
{
"en": "E4",
"fr": "F1"
}
{
"en": "E4",
"fr": "F2"
}
{
"en": "E4",
"fr": "F3"
}
{
"en": "E4",
"fr": "F4"
}
如何获取每个数组的第一个元素,第二个元素等的配对
答案 0 :(得分:3)
您还可以使用transpose
将数组“压缩”在一起:
[[.en,.fr] | transpose[] | {en:.[0], fr:.[1]} ]
答案 1 :(得分:1)
我使用range()遍历数组的元素:
jq '[range(.en|length) as $i | {en: .en[$i], fr: .fr[$i]}]' file.json
答案 2 :(得分:0)
这里的解决方案可以使用任意多个密钥,并且不需要事先知道密钥名称:
def objectify($keys):
[$keys, .] | transpose | map({(.[0]): .[1]}) | add;
keys_unsorted as $keys
| [[.[]] | transpose[] | objectify($keys)]