繁体   English   中英

jq:将对象数组转换为对象

[英]jq: translate array of objects to object

我收到来自curl的回复,格式如下:

[
  {
    "list": [
      {
        "value": 1,
        "id": 12
      },
      {
        "value": 15,
        "id": 13
      },
      {
        "value": -4,
        "id": 14
      }
    ]
  },
  ...
]

给定像这样的ID之间的映射:

{
  "12": "newId1",
  "13": "newId2",
  "14": "newId3"
}

我要这样做:

[
  {
    "list": {
      "newId1": 1,
      "newId2": 15,
      "newId3": -4,
    }
  },
  ...
]

这样,我就获得了从ID到值的映射(并希望重新映射ID)。

我已经为此工作了一段时间,每次遇到死角。

注意:如有必要,我可以使用Shell或类似工具执行循环。

编辑:这是到目前为止我开发的一个版本:

jq '[].list.id = ($mapping.[] | select(.id == key)) | del(.id)' -M --argjson "mapping" "$mapping"

我认为这不是最好的版本,但是我正在寻找是否可以找到更接近我所需的旧版本。

[编辑:以下回答是对问题的回答,它描述了(a)如下所示的映射,和(b)输入数据具有以下形式:

[
  {
    "list": [
      {
        "value": 1,
        "id1": 12
      },
      {
        "value": 15,
        "id2": 13
      },
      {
        "value": -4,
        "id3": 14
      }
    ]
  }
]

编辑结束]

在下文中,我将假定可以通过以下函数使用该映射,但这是一个无关紧要的假设:

def mapping: {
  "id1": "newId1",
  "id2": "newId2",
  "id3": "newId3"
} ;

然后,以下jq过滤器将产生所需的输出:

map( .list
     |= (map( to_entries[]
              | (mapping[.key]) as $mapped
              | select($mapped)
              | {($mapped|tostring): .value} )
         | add) )

有很多方法可以给猫皮。 我会这样:

.[].list |= reduce .[] as $i ({};
    ($i.id|tostring) as $k
      | (select($mapping | has($k))[$mapping[$k]] = $i.value) // .
)

您只需通过单独的文件或参数提供映射。

$ cat program.jq
.[].list |= reduce .[] as $i ({};
    ($i.id|tostring) as $k
      | (select($mapping | has($k))[$mapping[$k]] = $i.value) // .
)

$ cat mapping.json
{
  "12": "newId1",
  "13": "newId2",
  "14": "newId3"
}

$ jq --argfile mapping mapping.json -f program.jq input.json
[
  {
    "list": {
      "newId1": 1,
      "newId2": 15,
      "newId3": -4
    }
  }
]

这是针对修订后的问题的免费解决方案。

在下文中,我将假定可以通过以下函数使用该映射,但这是一个无关紧要的假设:

def mapping:
{
  "12": "newId1",
  "13": "newId2",
  "14": "newId3"
} ;


map( .list
     |= (map( mapping[.id|tostring] as $mapped
              | select($mapped)
              |  {($mapped): .value} )
         | add) )

“选择”是出于安全考虑(即,它检查所考虑的.id是否确实已映射)。 通过编写{($mapped|tostring): .value}来确保$mapped是一个字符串也可能是适当的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM