2017-02-13 2 views
0

중첩 된 배열에서 삭제 :이 내 데이터 구조입니다 JQ

[ 
    { 
     "name": "name1", 
     "organizations": [ 
      { 
       "name": "name2", 
       "spaces": [ 
        { 
         "name": "name3", 
         "otherkey":"otherval" 
        }, 
        { 
         "name": "name4", 
         "otherkey":"otherval" 
        } 
       ] 
      } 
     ] 
    }, 
    { 
     "name": "name21", 
     "organizations": [ 
      { 
       "name": "name22", 
       "spaces": [ 
        { 
         "name": "name23", 
         "otherkey":"otherval" 
        }, 
        { 
         "name": "name24", 
         "otherkey":"otherval" 
        } 
       ] 
      } 
     ] 
    } 
] 
난 그냥, 이름 = NAME1을 유지 이름 = NAME4으로 중첩 된 배열 객체를 제거 할 그대로 객체의 나머지 부분을 유지하려는

. 나는 map (select)로 시도했지만 이것이 단지 완전한 객체를 줄 것이다. 특정 하위 배열에 대해 del과 함께 작업하고 나머지는 그대로 유지할 수 있습니까?

결과는 다음과 같아야합니다. 또한 나는 외부 객체를 유지하기 위해 모든 속성을 열거하지 않으려합니다.

[ 
    { 
     "name": "name1", 
     "organizations": [ 
      { 
       "name": "name2", 
       "spaces": [ 
        { 
         "name": "name3", 
         "otherkey":"otherval" 
        } 
       ] 
      } 
     ] 
    } 
] 

어떤 아이디어가 있습니까? 감사!

답변

0

아주 표적으로 한 솔루션은 다음과 같습니다

walk(if type == "object" and .spaces|type == "array" 
    then .spaces |= map(select(.name != "name4")) 
    else . end) 

또는 :

path(.[0].organizations[0].spaces) as $target 
| (getpath($target) | map(select(.name != "name4"))) as $new 
| setpath($target; $new) 

허용하면,하지만 당신은 고려해 볼 수 있습니다

del(.. | .spaces? // empty | .[] | select(.name == "name4")) 

(당신의 JQ가없는 경우 walk/1이면 jq 정의는 검색을 통해 쉽게 찾을 수 있습니다.)

여기
0

1,515,은 가 감소 선택 을 사용하여 용액 tostream 및 delpaths이다

map( 
    select(.name == "name1") 
    | reduce (tostream|select(length==2)) as [$p,$v] (
     . 
    ; if [$p[-1],$v] == ["name","name4"] then delpaths([$p[:-1]]) else . end 
    ) 
)