6

我已经为此撞了几个小时的头,但似乎找不到办法做到这一点。我有一个键数组和一个值数组,如何生成一个对象?输入:

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

输出:

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

5 回答 5

8

在github上解决了这个问题:

.[0] as $keys |
.[1] as $values |
reduce range(0; $keys|length) as $i  ( {}; . + { ($keys[$i]): $values[$i] })
于 2015-01-23T20:03:28.383 回答
3

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

transpose | reduce .[] as $pair ({}; .[$pair[0]] = $pair[1])
于 2015-01-23T15:32:53.130 回答
2

只是要清楚:

(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
}
于 2015-09-05T17:26:12.690 回答
1

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

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

韦尔普,我认为这很容易,有一点序言经验......哦,伙计。最后我也把头撞到了墙上。不要以为我会再使用 jq 了。

于 2015-01-23T06:24:08.950 回答
0

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

  .[1] as $v
| reduce .[0][] as $k (
   {idx:0, result:{}}; .result[$k] = $v[.idx] | .idx += 1
  )
| .result
于 2017-08-03T17:11:00.607 回答