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

如何使用JQ同时输出键名及对应值?筛选属性时保留外层键

问题根因

你写的筛选逻辑里用了.[]遍历对象,这个语法在遍历JSON对象时会自动丢弃外层键名,仅返回对应的值,所以筛选后自然丢失了test1、test4这类外层键。

正确JQ写法

直接执行下面的命令即可得到预期输出:

jq 'to_entries | map(select(.value.name | ascii_downcase | contains("john"))) | from_entries' 你的数据文件.json
逻辑说明

整个命令的执行流程分三步:

  • to_entries:将原始对象转换为键值对数组,每个数组元素的固定结构为{"key": "原外层键名", "value": "原键对应的内容"},转换后你原始的第一条数据就会变成{"key":"test1","value":{"name":"John"}}的形式
  • map(select(...)):遍历上述键值对数组,保留value中name字段转小写后包含"john"的条目
  • from_entries:将筛选后的键值对数组重新转换为普通JSON对象,还原成键和值一一对应的结构
补充优化

如果你需要精确匹配name值为John(而非模糊包含,比如contains("john")会把name为"johnny"的条目也匹配出来),可以把筛选条件改成精确相等判断,命令如下:

jq 'to_entries | map(select(.value.name | ascii_downcase == "john")) | from_entries' 你的数据文件.json

用你提供的样例数据执行上述命令,输出结果完全符合预期:

{
  "test1": {
    "name": "John"
  },
  "test4": {
    "name": "John"
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 20:45:36