使用jq判断数组元素是否存在于另一数组时的索引错误求助
问题分析与解决方案
首先明确你的场景:
a_names.json内容:{"Names": ["a","b","c"]}b_names.json内容:{"Names": ["b","c"]}
你遇到的Cannot index string with string错误,核心原因是上下文混淆:
当你写a_names.Names | contains([b_names.Names[.counter]])时,当前管道的.指向的是a_names.Names数组(或遍历数组时的单个字符串元素),而非你预期的计数器变量。尝试用字符串(或字符串的不存在属性)去索引数组,自然触发错误。
正确解决方法
方法1:直接遍历检查(推荐,无需计数器)
使用jq的IN操作符(需jq 1.6及以上版本),简洁判断每个b中的元素是否存在于a的数组:
jq --slurpfile a a_names.json --slurpfile b b_names.json ' $b[0].Names[] as $name | $name | IN($a[0].Names[]) '
执行后会依次输出true、true,对应b中的"b"和"c"。
如果你的jq版本较低,用contains实现:
jq --slurpfile a a_names.json --slurpfile b b_names.json ' $b[0].Names[] as $name | $a[0].Names | contains([$name]) '
方法2:使用计数器(若必须保留循环计数逻辑)
明确绑定计数器变量,避免上下文混淆:
jq --slurpfile a a_names.json --slurpfile b b_names.json ' # 生成0到b数组长度-1的计数器 range($b[0].Names | length) as $counter | # 用$counter索引b的数组,再检查是否在a的数组中 $a[0].Names | contains([$b[0].Names[$counter]]) '
这里用range()生成计数器并通过as $counter显式绑定,后续用$counter索引数组,完全避开了上下文冲突问题。
为什么你的直接写法有效?
你测试的a_names.Names | contains(["b"])能正常运行,是因为这里直接传入了字符串数组["b"],没有涉及上下文混淆的变量引用,jq可以正确解析并执行包含判断。
内容的提问来源于stack exchange,提问作者V1st
相关产品推荐
相关产品推荐

