You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在jq中添加父键?将数组元素内值提升为元素父键

解决jq中用数组元素属性作为父键的问题

嘿,我来帮你搞定这个jq的问题!你之前尝试的map(.name: {.})命令没法正常工作,主要是两个语法问题:一是动态键名的写法不对,二是{.}这种写法不符合jq的语法规范。下面给你几种不同需求对应的正确写法,你可以根据自己的实际情况选择:

情况1:每个数组元素转为以自身name为键、整个元素为值的对象

如果你的目标是让数组里的每个元素都变成一个独立的对象,键是该元素的name值,值是整个元素本身,用这个命令:

jq 'map({(.name): .})'

举个例子:

输入JSON:
[
{"name": "Alice", "email": "alice@example.com"},
{"name": "Bob", "email": "bob@example.com"}
]

输出结果:
[
{
"Alice": {
"name": "Alice",
"email": "alice@example.com"
}
},
{
"Bob": {
"name": "Bob",
"email": "bob@example.com"
}
}
]

情况2:将整个数组合并为一个大对象,键为各元素的name

如果你想把整个数组转换成一个单一对象,用每个元素的name作为键,对应元素作为值,用这个命令:

jq 'from_entries(map({key: .name, value: .}))'

示例效果:

输入JSON:
[
{"name": "Alice", "email": "alice@example.com"},
{"name": "Bob", "email": "bob@example.com"}
]

输出结果:
{
"Alice": {
"name": "Alice",
"email": "alice@example.com"
},
"Bob": {
"name": "Bob",
"email": "bob@example.com"
}
}

情况3:将name作为父键,值为去掉name属性后的元素

如果希望父键是name值,而值里不再包含name属性,可以用del命令移除它:

jq 'map({(.name): del(.name)})'

示例效果:

输入JSON:
[
{"name": "Alice", "email": "alice@example.com"},
{"name": "Bob", "email": "bob@example.com"}
]

输出结果:
[
{
"Alice": {
"email": "alice@example.com"
}
},
{
"Bob": {
"email": "bob@example.com"
}
}
]

关键语法说明

  • (.name):用括号包裹属性访问是jq中定义动态键名的方式,这样jq才会把.name的值作为键,而不是把字符串.name当成键名。
  • map(...):遍历数组中的每一个元素,对每个元素执行括号内的操作。
  • from_entries:专门用来把[{key: "键名", value: "值"}, ...]格式的数组转换成对应的对象。
  • del(.name):删除当前元素的name属性,返回剩下的属性组成的对象。

内容的提问来源于stack exchange,提问作者RaGe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 06:57:16