Arrays 使用jq将两个JSON数组合并到一个文件中

Arrays 使用jq将两个JSON数组合并到一个文件中,arrays,json,jq,Arrays,Json,Jq,我有一个包含两个数组的JSON文件。我想将这些数组组合成一个对象数组,每个对象数组包含来自每个原始数组的一个元素 JSON输入如下所示: { "en": [ "E1", "E2", "E3", "E4" ], "fr": [ "F1", "F2", "F3&qu

我有一个包含两个数组的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"
}
如何让它对每个数组的第一个元素、第二个元素等进行配对。

我使用range()对数组的元素进行迭代:

jq '[range(.en|length) as $i | {en: .en[$i], fr: .fr[$i]}]' file.json

您还可以使用
transpose
将数组“压缩”在一起:

[[.en,.fr] | transpose[] | {en:.[0], fr:.[1]} ]

这里有一个解决方案,可以处理任意多个密钥,并且不需要事先知道密钥名称:

def objectify($keys):
  [$keys, .] | transpose | map({(.[0]): .[1]}) | add;

keys_unsorted as $keys
| [[.[]] | transpose[] | objectify($keys)]

.en
.fr
是否总是固定的?或者密钥名称可以是动态的?@Inian密钥会改变,但我不介意使用“硬编码”的jq过滤器。。。谢谢@peak,之前没有遇到过transpose-完成任务吗