![jq에서 함수 정의 및 맵 사용](https://linux55.com/image/197437/jq%EC%97%90%EC%84%9C%20%ED%95%A8%EC%88%98%20%EC%A0%95%EC%9D%98%20%EB%B0%8F%20%EB%A7%B5%20%EC%82%AC%EC%9A%A9.png)
다음 두 가지의 차이점을 설명해 주실 수 있나요?
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()
make 함수의 추가가 첫 번째 요소를 사용하기 때문에 이는 중요합니다.각 개별 하위 배열입력 배열. 두 번째 경우에는 map()
함수 내부에서 실행되며 다음을 사용하여 추가가 수행됩니다.전체 첫 번째 하위 배열입력 배열.
첫 번째 함수에서는
def addvalue(f): . + [f];
[f]
입력 스트림의 배열로 간주되는 항목 에 배열을 추가합니다 . 하나의 배열을 다른 배열에 추가하면 배열에 새 요소가 추가되는 효과가 있습니다.
각 배열에 대해 이 addvalue()
함수를 두 번 호출할 수 있으며 ; 첫 번째 호출에서 will은 이므로 첫 번째 배열에 새 요소로 추가하여 결과는 입니다 . 마찬가지로 두 번째 통화부터 시간 을 알 수 있습니다 .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]]
이는 함수가 두 번 호출되었음을 보여줍니다. 결과 작업에 대한 첫 번째 호출 과 두 번째 호출에서 값 이 제공 [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]
추가합니다 . 하나의 배열을 다른 배열에 추가하면 배열의 요소가 서로 추가되는 효과가 있으므로 결과 배열의 두 요소 로 sum이 생성됩니다.[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 ]