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 ]

相關內容