Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 从键和值数组创建对象_Arrays_Json_Object_Transpose_Jq - Fatal编程技术网

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