jq中定义函数并使用map

jq中定义函数并使用map

您能向我解释一下以下两者有何不同吗?

jq ´def addvalue(f): . + [f]; map(addvalue(.[0]))´

[[1,2],[10,20]]
=> [[1,2,1], [10,20,10]]

jq ´def addvalue(f): f as $x | map(. + $x); addvalue(.[0])´
[[1,2],[10,20]]
=> [[1,2,1,2], [10,20,1,2]]

谢谢。

答案1

摘要: 这两个函数以及调用它们的方式的不同之处在于map()操作发生的位置以及加法中使用的内容。这很重要,因为在第一种情况下,map()调用中的 使函数中的加法使用第一个元素每个单独的子阵列输入数组的。第二种情况,map()在函数内部执行,加法是使用整个第一个子数组输入数组的。


在第一个函数中,

def addvalue(f): . + [f];

您将该数组添加到[f]假定为输入流中的数组的位置。将一个数组添加到另一个数组具有将新元素追加到该数组的效果。

您可以使用;调用此addvalue()函数两次map()每个数组[1,2]和一次[10,20]。在第一次调用中,[f]will 是[1],因此您将1其作为新元素添加到第一个数组中,产生[1,2,1]。同样,您可以[10,20,10]从第二次调用中得到 time [f]is [10]

添加调试功能,

def addvalue(f): debug | . + [f]

当按照问题中的方式调用它时,我们得到以下结果:

["DEBUG:",[1,2]]
["DEBUG:",[10,20]]

这表明该函数被调用了两次。该值[f][1]在第一次调用中,产生操作[1,2] + [1],给出[1,2,1][10]在第二次调用中,[10,20] + [10]产生[10,20,10]map()调用中的操作会将这些数组组合成[[1,2,1],[10,20,10]].


在函数中

def addvalue(f): f as $x | map(. + $x);

您调用map()输入流中假定为数组的内容。对于输入数组中的每个元素,添加$x到该元素。的值$x是数组的第一个元素。

您可以使用数组[[1,2],[10,20]]作为输入数组并使用 with[1,2]作为参数调用此函数一次。对于输入数组的每个元素,即对于[1,2][10,20],您添加[1,2]( 的值$x,数组的第一个元素)。将一个数组添加到另一个数组会产生将数组的元素相互附加的效果,因此最终会得到[1,2,1,2][10,20,1,2]作为结果数组的两个元素。

以与第一个函数类似的方式在第二个函数中启用调试,

def addvalue(f): debug | f as $x | map(. + $x);

我们得到输出

["DEBUG:",[[1,2],[10,20]]]

这表明该函数被调用了一次。该map()操作将创建一个数组,其中输入数组的每个元素都已[1,2]添加到自身,并给出[[1,2,1,2],[10,20,1,2]]结果。


要使第一个函数充当第二个函数,您必须使用以下方式调用它

.[0] as $x | map(addvalue($x[]))

要使第二个函数充当第一个函数,您必须将其称为

[ .[] as $x | [$x] | addvalue([$x[0]]) | add ]

相关内容