将两个相同count的数组内容值转入键值对

问题描述 投票:0回答:3

我有一个问题。 假设我有一个像这样的 json 文档:

{
  "counts": [
    17,
    1014,
    22,
    9,
    11
  ],
  "values": [
    "5",
    "10",
    "15",
    "20",
    "25"
  ]
}

我想得到这样的结果:

{
    "5":17,
    "10":1014,
    "15":22,
    "20":9,
    "25":11
}

基本上,数组元素被分配为一个接一个的键值对。我怎样才能做到这一点?

我尝试了 jq

with_entries(.values = .counts)
with_entries(.values[] = .counts[])
但没有成功。

json jq key-value
3个回答
3
投票

我会将

transpose
reduce
一起使用:

[ .counts, .values ] | transpose | reduce .[] as $t ({}; .[$t[1]] = $t[0])

输出:

{
  "5": 17,
  "10": 1014,
  "15": 22,
  "20": 9,
  "25": 11
}

在线演示


3
投票

这里有两个

transpose
免费的解决方案:

[(.counts | keys[]) as $i | {(.values[$i]): .counts[$i]}] | add

演示

. as {$values} | .counts | with_entries(.key |= $values[.])

演示

输出:

{
  "5": 17,
  "10": 1014,
  "15": 22,
  "20": 9,
  "25": 11
}

0
投票

基于@pmf的回答,这里有一个小小的改进:

. as $in
| reduce (.values|keys[]) as $i (
    {};
    .[$in.values[$i]] = $in.counts[$i]
)

它避免了一些隐藏在

with_entries
或普通中的中间对象 在
add
之前可见,并直接转到
reduce
with_entries
add
也使用它。

© www.soinside.com 2019 - 2024. All rights reserved.