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

如何用JQ从JSON数组中筛选出唯一的JSON对象

问题分析

你的jq命令之所以输出重复数组,核心原因是getPreVal($input)会遍历sc数组的每个fix字段(输出"Hello"和"Hello2"两个结果),而jq管道会对每个输入执行后续命令,导致getWhereVal($input)被触发两次,进而重复输出整个sc数组。unique函数在这里无效,因为原数组内的对象本身就是唯一的。

解决方案

情况1:仅获取sc数组的对象集合(无重复输出)

直接移除多余的getPreVal相关逻辑,使用最简命令:

.sc[]

执行后输出(每个对象单独一行,符合JSON流格式):

{"pn": "di","pv": {"val": "26","com": "="},"fix": "Hello","tp": "String"}
{"pn": "di2","pv": {"val": "28","com": "="},"fix": "Hello2","tp": "String"}

如果需要你预期的逗号分隔格式(非标准JSON,但匹配需求),可使用:

.sc | map(tostring) | join(",")

输出:

{"pn":"di","pv":{"val":"26","com":"="},"fix":"Hello","tp":"String"},{"pn":"di2","pv":{"val":"28","com":"="},"fix":"Hello2","tp":"String"}

情况2:需同时关联fix字段与对应对象

如果需要保留fix和对象的关联关系,可调整命令:

.sc[] | {fix, obj: .}

输出:

{"fix":"Hello","obj":{"pn":"di","pv":{"val":"26","com":"="},"fix":"Hello","tp":"String"}}
{"fix":"Hello2","obj":{"pn":"di2","pv":{"val":"28","com":"="},"fix":"Hello2","tp":"String"}}
原命令错误点拆解
  • getPreVal(input): input.sc[].fix:该函数会遍历sc数组的每个元素,输出每个元素的fix值,产生多个输入流。
  • . as $input | getPreVal($input) as $preVal | getWhereVal($input):getPreVal($input)输出两个值,每个值都会触发后续的getWhereVal($input),导致getWhereVal被执行两次,最终重复输出数组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 10:33:35