2016-10-12 2 views
3

객체 배열을 처리하는 좀 더 복잡한 JQ 표현식이 있습니다.JQ : 배열에 객체를 추가하고 배열에 추가합니다.

{ 
    "1": { "values": ["value 1", "value 3"] }, 
    "2": { "values": ["value 2"] } 
} 

또는 내 사용 사례 :

{ 
    "1": [ "value 1", "value 3" ], 
    "2": [ "value 2" ] 
} 

도 OK 것 내가 얻고 싶은 것은 이것이다

[ 
    { "key": "1", "value": "value 1"}, 
    { "key": "2", "value": "value 2"}, 
    { "key": "1", "value": "value 3"}, 
] 

:

입력은 다음과 같습니다 .

나는 이미 … | { (.key): [.value] }을 사용하려고 시도했지만 결과는 (나에게 놀랄 일이 아니다) 나중에 키의 발생이 기존의 것들을 단순히 덮어 쓴다는 것이다. 내가 달성하고자하는 것은 "새로운 키/값 쌍을 생성하거나 이미 존재하는 '값'배열에 .value를 추가하는 것과 같습니다.

답변

2

좋아요. 마침내 내가 원했던 것을 찾은 후에도 이전 필터가 입력 배열을 유지하지 못했지만 객체가 서로 이어지는 결과를 초래한다는 것을 이해합니다. 그래서 이것이 제가 발견 한 모든 예제가 효과가 없을 것이라는 근본적인 이유였습니다.

이미 group_by가 작동하지만 작동하지 않는 키 (따라서 키/값 요구 사항)별로 그룹화하려고했습니다.

작은 단계만으로 내 솔루션 (고유 키, 배열 값)을 그룹화하는 것에서부터.

'… group_by(.key) | map({ "key": .[0].key, "values": map(.value) | unique })' 

출력은 지금 내 요구 사항에 완벽하게 정상적으로, 이는 다음과 같습니다 group_by에 의존하는 솔루션의

[ 
    { 
     "key": "1", 
     "values": [ 
      "value 1", 
      "value 3" 
     ], 
    }, 
    { 
     "key": "2", 
     "values": [ 
      "value 2" 
     ] 
    } 
] 
1

단점이 group_by 여기에 불필요한 정렬을 필요로한다는 것이다. 이 답변에서는 필자는 본질적으로 (그리고 일반적으로 유용한) jq 함수를 사용하여 정렬을 피하는 방법을 보여줄 것입니다.이 함수는 기본적으로 각 키의 값을 배열로 팝핑 한 다음 JSON 객체의 배열을 "병합"합니다. 배열. 그런 다음 필터 def data: [ { "key": "1", "value": "value 1"}, { "key": "2", "value": "value 2"}, { "key": "1", "value": "value 3"} ] ;

:

data | map([.] | from_entries) | meld 

가 생성됩니다

{"1":["value 1","value 3"],"2":["value 2"]} 

# input should be an array of objects def meld: reduce .[] as $o ({}; reduce ($o|keys)[] as $key (.; .[$key] += [$o[$key]]));

하는의도 일부 데이터를 정의 할 수

관련 문제