【问题标题】:Using jq, convert array of objects to object with named keys使用 jq,将对象数组转换为具有命名键的对象
【发布时间】:2017-07-14 15:23:25
【问题描述】:

给定一个 json 文件,格式为:

[
 {
  name : "A",
  value : "1"
 },
 {
  name : "B",
  value : "5"
 },
 {
  name : "E",
  value : "8"
 }
]

如何使用 jq 将其转换为类似的东西:

{
 "A" : {
   name : "A",
   value : "1"
 },
 "B" : {
  name : "B",
  value : "5"
 },
 "E" : {
  name : "E",
  value : "8"
 }
}

jq '{(.[].name) : "the name"}' 'myfile.json' 给我一个带有 [].name 键的对象,但我如何将对象分配给它?

【问题讨论】:

  • 你能贴一些代码吗?本网站并非旨在为您的练习提供完整的解决方案

标签: json object key command-line-interface jq


【解决方案1】:
map( { (.name|tostring): . } ) | add

tostring 是为了安全/稳健。)

索引/1

如果你的jq有INDEX/1(1.5版发布后引入),你可以简单写:

INDEX(.name)

【讨论】:

  • 它最后需要一个add,因为他希望将结果作为一个对象。
  • 谢谢,@JeffMercado。
  • 谢谢,这很好用。仍在尝试习惯 jq 的强大功能,但我发现的示例通常太简单或太复杂。
  • 对不起,也许我很笨,但是你能举一个完整的例子来说明如何使用INDEX吗?我得到: jq: error: INDEX/1 is not defined at -- 但我确实有 jq 1.5
  • “之后”的意思是“之后”。对于它的定义,google for:def INDEX builtin.jq
【解决方案2】:

只需通过数组中的项目构建一个新对象。将项目添加到以name 为键的对象中。

reduce .[] as $i ({}; .[$i.name] = $i)

【讨论】:

  • reduce 比 INDEX 高效得多。
  • ...更灵活,因为您可以即时进行转换,并且对 JS 开发人员更熟悉
猜你喜欢
  • 2019-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-07
  • 2023-01-24
  • 2021-10-14
相关资源
最近更新 更多