Arrays 从键和值数组创建对象
我已经在这件事上撞了好几个小时了,但似乎找不到办法。我有一个键数组和一个值数组,如何生成一个对象?输入:Arrays 从键和值数组创建对象,arrays,json,object,transpose,jq,Arrays,Json,Object,Transpose,Jq,我已经在这件事上撞了好几个小时了,但似乎找不到办法。我有一个键数组和一个值数组,如何生成一个对象?输入: [["key1", "key2"], ["val1", "val2"]] 输出: {"key1": "val1", "key2": "val2"} { "k1": 1, "k2": 2, "k3": 3 } 请注意,它实际上不适用于任何大于大小2的阵列 [map([0]),map([1])]| map({[0]):[1]})添加 嗯,我想这很容易,有一点开场白的经验。。。哦
[["key1", "key2"], ["val1", "val2"]]
输出:
{"key1": "val1", "key2": "val2"}
{
"k1": 1,
"k2": 2,
"k3": 3
}
请注意,它实际上不适用于任何大于大小2的阵列
[map([0]),map([1])]| map({[0]):[1]})添加
嗯,我想这很容易,有一点开场白的经验。。。哦,老兄。我的头也撞到了墙上。不要认为我会再次使用jq。当前版本的jq有一个
转置过滤器,可用于将键和值配对。您可以很容易地使用它来构建结果对象
transpose | reduce .[] as $pair ({}; .[$pair[0]] = $pair[1])
决议如下:
我想说清楚:
(0)Abdullah Jibaly的解决方案简单、直接、高效且通用,应适用于jq的所有版本
(1) transpose/0是JQ1.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] ]
输出:
{"key1": "val1", "key2": "val2"}
{
"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
谢谢你的努力!事实上,我找到了答案(参见更新的Q)。如果我们有一些更典型的函数方法,比如内置的zip
,那其实还不算太糟糕。幸运的是,实现它并不太糟糕。谢谢Jeff,但我不确定这是否有效。我对它进行了研究,第一部分似乎生成了每一个key/val组合,但是from_条目似乎用错误的key/val对覆盖了正确的key/val对。这就是我得到的:{“key1”:“val2”,“key2”:“val2”}
Ah dang it,我知道交叉产品可能是个问题。当我检查它时,我认为它很好。可惜没有内置的zip
过滤器。这样就很简单了,不需要使用from_条目。即:转置| map({([0]):[1]})| add