将两个数组合并为一个对象,使用jq

11
我正在尝试使用jq将NOAA数据源解析为我所需要的值:

http://forecast.weather.gov/MapClick.php?FcstType=json&lat=39.56&lon=-104.85

我能够(分别)提取出我想要合并的两个数组:

$ cat noaa.json | jq .time.startPeriodName
[
  "Today",
  "Tonight",
  "Friday",
  "Friday Night",
  "Saturday",
  "Saturday Night",
  "Sunday",
  "Sunday Night",
  "Monday",
  "Monday Night",
  "Tuesday",
  "Tuesday Night",
  "Wednesday"
]

$ cat noaa.json | jq .data.weather
[
  "Mostly Sunny",
  "Mostly Cloudy",
  "Mostly Sunny",
  "Partly Cloudy",
  "Slight Chance Showers",
  "Slight Chance Snow Showers",
  "Slight Chance Snow Showers then Mostly Sunny",
  "Mostly Clear",
  "Mostly Sunny",
  "Partly Cloudy",
  "Mostly Sunny",
  "Partly Cloudy",
  "Mostly Sunny"
]

我希望将这两个数组合并成一个对象,就像这样:
{ 
   "Today": "Mostly Sunny",
   "Tonight": "Mostly Cloudy",
   ...
   "Wednesday": "Mostly Sunny"
}

我希望有人能够指点我方向。我觉得答案可能在map操作符中,但我还没有弄清楚。

1个回答

20

是的,map是一种很好的方法。关键在于与 transpose/0 一起使用,它可以像“zip”函数一样使用:

是的,map 是一个不错的选择。关键在于与 transpose/0 结合使用,它可以像“zip”函数一样使用:

 [.time.startPeriodName, .data.weather]
 | transpose
 | map( {(.[0]): .[1]})

输出如下:

[
  {
    "Today": "Mostly Sunny"
  },
  {
    "Tonight": "Mostly Cloudy"
  },
  ...

因此,要生成单个JSON对象,只需将add过滤器添加到管道中即可。


1
这很有帮助。我能否以某种方式运行transposemap,以便最终得到单个对象而不是对象数组?或者还有其他转换方法可以将此结果数组合并为单个对象吗? - Scott
2
啊,我在末尾添加了 | add,得到了我想要的结果。 - Scott
以下是一个引用路径以获取初始数组的示例。jq ".results[0].result.tag | [.classes, .probs] | transpose | map( {(.[0]): .[1]} ) | add" myinput.txt - BSalita
我获取对象键的数组是 number 类型,我只需在映射中使用 .[0]|tostring(例如,管道到 tostring),参考 这个问题的答案 - crackpotHouseplant
1
从一对列表构建字典的另一个选项是 map({key: .[0], value: .[1]}) | to_entries - augurar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接