如何用JQ将条目quadrant字段替换为数组对应值的索引?
问题:将JSON中entries的quadrant字段替换为对应索引
原始JSON数据
{"quadrants": ["Languages + Frameworks", "Tools", "Platforms", "Techniques"],"entries": [{"quadrant": "Languages + Frameworks"},{"quadrant": "Platforms"},{"quadrant": "Languages + Frameworks"}]}
需求说明
将entries数组中每个条目的quadrant字段值,替换为该值在顶层quadrants数组中的对应索引,预期输出:
{"quadrants": ["Languages + Frameworks", "Tools", "Platforms", "Techniques"],"entries": [{"quadrant": 0},{"quadrant": 2},{"quadrant": 0}]}
错误的JQ脚本
执行以下脚本后,所有quadrant字段返回null:
jq ' .entries |= map( .quadrant = (.quadrant as $q | (.quadrants | index($q))) ) ' "$1"
问题根源
在map函数内部,当前上下文是entries数组的单个元素对象,此时.quadrants无法引用顶层的quadrants数组——上下文切换后,当前对象没有quadrants属性,所以index($q)找不到匹配项,返回null。
正确的JQ脚本
先将顶层的quadrants数组存储为变量,再在map中使用该变量进行索引查找:
jq ' .quadrants as $quads | .entries |= map( .quadrant = $quads | index(.quadrant) ) ' "$1"
更简洁的写法(直接遍历entries元素修改):
jq ' .quadrants as $q | .entries[] |= .quadrant = ($q | index(.quadrant)) ' "$1"
验证结果
执行正确脚本后,输出与预期完全一致:
{"quadrants": ["Languages + Frameworks", "Tools", "Platforms", "Techniques"],"entries": [{"quadrant": 0},{"quadrant": 2},{"quadrant": 0}]}
内容的提问来源于stack exchange,提问作者A Dev
相关产品推荐
相关产品推荐

