从键和值数组创建对象
Create object from array of keys and values
为此,我已经用头撞墙好几个小时了,似乎找不到解决方法。我有一个键数组和一个值数组,如何生成一个对象?输入:
[["key1", "key2"], ["val1", "val2"]]
输出:
{"key1": "val1", "key2": "val2"}
从头开始,它实际上不适用于任何大于 2 的数组。
[map(.[0]) , map(.[1])] | map({(.[0]):.[1]}) | add
好吧,我认为这会很容易,只要有一点 prolog 经验...天哪。我最后也把头撞在墙上。别以为我会再用 jq 了。
当前版本的 jq 有一个 transpose
过滤器,可用于配对键和值。您可以使用它轻松构建结果对象。
transpose | reduce .[] as $pair ({}; .[$pair[0]] = $pair[1])
已在 github 上解决此问题:
.[0] as $keys |
.[1] as $values |
reduce range(0; $keys|length) as $i ( {}; . + { ($keys[$i]): $values[$i] })
明确一点:
(0) Abdullah Jibaly 的解决方案简单、直接、高效且通用,应该适用于所有版本的 jq;
(1) transpose/0 是 jq 1.5 中的内置函数,自 2014 年 10 月起在预发行版中可用;
(2) 使用 transpose/0(或上面定义的 zip/0),一个更短但仍然简单、快速和通用的问题解决方案是:
transpose | map( {(.[0]): .[1]} ) | add
示例:
$ jq 'transpose | map( {(.[0]): .[1]} ) | add'
输入:
[["k1","k2","k3"], [1,2,3] ]
输出:
{
"k1": 1,
"k2": 2,
"k3": 3
}
这是一个使用 reduce 的解决方案,状态对象包含迭代索引和结果对象。它遍历 .[0]
中的键,在 .[1]
的结果中设置相应的值
.[1] as $v
| reduce .[0][] as $k (
{idx:0, result:{}}; .result[$k] = $v[.idx] | .idx += 1
)
| .result
为此,我已经用头撞墙好几个小时了,似乎找不到解决方法。我有一个键数组和一个值数组,如何生成一个对象?输入:
[["key1", "key2"], ["val1", "val2"]]
输出:
{"key1": "val1", "key2": "val2"}
从头开始,它实际上不适用于任何大于 2 的数组。
[map(.[0]) , map(.[1])] | map({(.[0]):.[1]}) | add
好吧,我认为这会很容易,只要有一点 prolog 经验...天哪。我最后也把头撞在墙上。别以为我会再用 jq 了。
当前版本的 jq 有一个 transpose
过滤器,可用于配对键和值。您可以使用它轻松构建结果对象。
transpose | reduce .[] as $pair ({}; .[$pair[0]] = $pair[1])
已在 github 上解决此问题:
.[0] as $keys |
.[1] as $values |
reduce range(0; $keys|length) as $i ( {}; . + { ($keys[$i]): $values[$i] })
明确一点:
(0) Abdullah Jibaly 的解决方案简单、直接、高效且通用,应该适用于所有版本的 jq;
(1) transpose/0 是 jq 1.5 中的内置函数,自 2014 年 10 月起在预发行版中可用;
(2) 使用 transpose/0(或上面定义的 zip/0),一个更短但仍然简单、快速和通用的问题解决方案是:
transpose | map( {(.[0]): .[1]} ) | add
示例:
$ jq 'transpose | map( {(.[0]): .[1]} ) | add'
输入:
[["k1","k2","k3"], [1,2,3] ]
输出:
{
"k1": 1,
"k2": 2,
"k3": 3
}
这是一个使用 reduce 的解决方案,状态对象包含迭代索引和结果对象。它遍历 .[0]
中的键,在 .[1]
.[1] as $v
| reduce .[0][] as $k (
{idx:0, result:{}}; .result[$k] = $v[.idx] | .idx += 1
)
| .result