从键和值数组创建对象

时间:2015-01-23 05:18:47

标签: arrays json object transpose jq

我已经将头撞在墙上好几个小时了,似乎无法找到办法做到这一点。我有一组键和一组值,我如何生成一个对象?输入:

[["key1", "key2"], ["val1", "val2"]]

输出:

{"key1": "val1", "key2": "val2"}

5 个答案:

答案 0 :(得分:5)

github上解决此问题:

.[0] as $keys |
.[1] as $values |
reduce range(0; $keys|length) as $i  ( {}; . + { ($keys[$i]): $values[$i] })

答案 1 :(得分:3)

当前版本的jq有一个transpose过滤器,可用于配对键和值。您可以使用它来轻松构建结果对象。

transpose | reduce .[] as $pair ({}; .[$pair[0]] = $pair[1])

答案 2 :(得分:1)

从头开始,对于任何大于2的数组,它实际上都不起作用。

[map(.[0]) , map(.[1])] | map({(.[0]):.[1]}) | add

Welp,我认为这很容易,有一点经验......哦,伙计。我最后还把头撞在墙上。不要以为我会再次使用jq。

答案 3 :(得分:1)

要明确:

(0)Abdullah Jibaly的解决方案简单,直接,高效且通用,应该适用于所有版本的jq;

(1)transpose / 0是jq 1.5中的内置版本,自2014年10月起已预发布;

(2)使用转置/ 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
}

答案 4 :(得分:0)

这是一个解决方案,它使用 reduce 和一个包含迭代索引和结果对象的状态对象。它迭代.[0]中的键,设置.[1]

结果中的相应值
  .[1] as $v
| reduce .[0][] as $k (
   {idx:0, result:{}}; .result[$k] = $v[.idx] | .idx += 1
  )
| .result