首页 > 解决方案 > 如何使用`jq`将键复制到对象中?

问题描述

我的输入 JSON 如下所示:

{
  "2018-05-15T22:00:00Z": {
    "foo": "0.0",
    "bar": "90.0"
  },
  "2018-05-15T22:30:00Z": {
    "foo": "0.0",
    "bar": "70.0"
  }
}

我想将密钥(即日期时间)复制到对象本身中,最终得到:

{
  "2018-05-15T22:00:00Z": {
    "date": "2018-05-15T22:00:00Z",
    "foo": "0.0",
    "bar": "90.0"
  },
  "2018-05-15T22:30:00Z": {
    "date": "2018-05-15T22:30:00Z",
    "foo": "0.0",
    "bar": "70.0"
  }
}

然后,我将把外部对象折叠为一个数组(使用map(.)),以便最终结果是日期已被移动到每个对象中。

标签: jsonbashkeyjqdata-manipulation

解决方案


一种方法是to_entries将您的项目拆分为键/值对,之后可以直接引用每个项目。

$ jq '[to_entries[] | .key as $time | .value | .["time"]=$time]' <<<"$in"
[
  {
    "foo": "0.0",
    "bar": "90.0",
    "time": "2018-05-15T22:00:00Z"
  },
  {
    "foo": "0.0",
    "bar": "70.0",
    "time": "2018-05-15T22:30:00Z"
  }
]

推荐阅读