jqでの関数定義とマップの使用

jqでの関数定義とマップの使用

次の2つの違いを説明できますか?

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

要約:これら2つの関数の違いと呼び出し方法の違いは、タスクが発生map()する場所と追加に使用されるものです。最初のケースでは、map()make関数の追加が最初の要素を使用するため、これは重要です。各個別のサブ配列入力配列。 2番目のケースでは、map()関数の内部で実行され、次を使用して追加が実行されます。完全な最初のサブ配列入力配列。


最初の関数では

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

[f]入力ストリームの配列と見なされる項目に配列を追加します。ある配列を別の配列に追加すると、配列に新しい要素が追加される効果があります。

各配列に対してこのaddvalue()関数を2回呼び出すことができます。最初の呼び出しでは、willはそのため、最初の配列に新しい要素として追加した結果です。同様に、2番目の通話から時間がわかります。map()[1,2][10,20][f][1]1[1,2,1][10,20,10][f][10]

デバッグ機能を追加し、

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

質問でこれを呼び出すと、次のような結果が得られます。

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

これは、関数が2回呼び出されたことを示しています。結果操作の最初の呼び出しと2番目の呼び出しで値が提供され[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]]配列を入力配列として使用し、引数として使用して[1,2]この関数を一度呼び出すことができます。入力配列の各要素に(つまり、[1,2]およびの場合)(配列の最初の要素である値)を[10,20]追加します。ある配列を別の配列に追加すると、配列内の要素が互いに追加される効果があるため、結果の配列の2つの要素でsumが生成されます。[1,2]$x[1,2,1,2][10,20,1,2]

最初の関数と同様に、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]]結果が得られます。


最初の関数を2番目の関数として機能させるには、次のように呼び出す必要があります。

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

2番目の関数が最初の関数のように機能するようにするには、その関数を呼び出す必要があります。

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

関連情報