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

使用yq从JSON生成id与values组合字符串的异常问题

用yq实现id与对应values数组元素的拼接(避免笛卡尔积)

问题背景

给定类似如下结构的JSON(实际存在多层嵌套):

[
  {"id": "id1", "values": ["one", "two"]},
  {"id": "id2", "values": ["three"]}
]

需求是将每个对象的id字段与自身values数组的每个元素拼接为id-值格式的字符串,期望输出:

id1-one
id1-two
id2-three

使用jq可以通过以下命令实现正确结果:

.[] | .id as $ID | .values[] | $ID + "-" + .

但用yq执行类似逻辑时,会出现笛卡尔积式的错误输出(比如所有id和所有values元素交叉拼接),需要找到正确的yq实现方式。

解决方案

针对mikefarah/yq(当前主流的yq版本,支持JSON处理),正确的写法需要确保每个对象的id变量仅作用于自身的values遍历,避免上下文泄漏导致笛卡尔积:

基础场景命令

.[] | ( .id as $currentId | .values[] | $currentId + "-" + . )

多层嵌套场景示例

如果你的JSON是多层嵌套结构,比如:

{
  "parent": {
    "items": [
      {"id": "id1", "values": ["one", "two"]},
      {"id": "id2", "values": ["three"]}
    ]
  }
}

只需调整遍历路径即可:

.parent.items[] | ( .id as $currentId | .values[] | $currentId + "-" + . )

原理说明

yq的变量作用域规则和jq略有差异:如果不将id赋值与values遍历的逻辑用括号包裹,$currentId会脱离当前对象的上下文,最终遍历所有对象的id和所有values元素,从而产生笛卡尔积错误。用括号将每个对象的处理逻辑包裹后,就能确保每个id只和自身所属的values元素进行拼接。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 02:51:55