如何使用jq将数组中每个元素修改为「元素 is 元素」格式?
问题描述
原始JSON数据:
[ { "title": "Title1", "reference": [ "123" ] }, { "title": "Title2", "reference": [ "234", "345" ] } ]
需要将每个对象的reference数组元素修改为「元素 is 元素」的格式,预期结果:
[ { "title": "Title1", "reference": [ "123 is 123" ] }, { "title": "Title2", "reference": [ "234 is 234", "345 is 345" ] } ]
尝试以下jq命令时,在reference数组包含多个元素的情况下出错:
jq '.[] | .reference = [("\(.reference[]) is \(.reference[])")]'
错误结果生成了多余的笛卡尔积组合:
{ "title": "Title1", "reference": [ "123 is 123" ] } { "title": "Title2", "reference": [ "234 is 234", "345 is 234", "234 is 345", "345 is 345" ] }
解决办法
使用以下jq命令即可实现预期效果:
jq '.[] | .reference |= map("\(.) is \(.)")'
如果需要输出完整的数组结构(而非单个对象),可以在外层加上数组包裹:
jq '[.[] | .reference |= map("\(.) is \(.)")]'
原命令出错原因
原命令里的"\(.reference[]) is \(.reference[])"会两次展开reference数组的元素,相当于把数组内的每个元素和所有元素配对组合,自然生成了大量多余条目。
而map()函数会逐个遍历reference数组的元素,对每个元素单独执行字符串拼接操作,确保每个元素只生成对应的「元素 is 元素」字符串,不会出现乱配对的情况。|=运算符则用于直接修改原对象的reference属性,保证结构完整。
内容的提问来源于stack exchange,提问作者Spanner0jjm
相关产品推荐
相关产品推荐

