2017-02-13 2 views
0

diese meine Datenstruktur ist:Löschen auf verschachtelte Array mit 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" 
        } 
       ] 
      } 
     ] 
    } 
] 

Ich möchte nur name = name1 halten, mit name = name4 das verschachtelte Array-Objekt entfernen und den Rest des Objekts beibehalten möchten intakt . Ich habe versucht mit Karte (wählen), aber das wird mir nur das vollständige Objekt geben. Ist es möglich, mit bestimmten Sub-Arrays zu arbeiten und den Rest so zu behalten?

Ergebnis sollte das folgende sein. zusätzlich möchte ich Aufzählung vermeiden, dass alle auf äußere Objekte zu halten Attribute:

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

eine Idee? Vielen Dank!

Antwort

0

Eine sehr gezielte Lösung wäre:

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

Wenn zulässig, obwohl, sollten Sie überlegen:

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

oder:

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

(Wenn Ihr jq nicht hat walk/1 dann kann seine jq-Definition leicht durch googeln gefunden werden.)

Hier
0

ist eine Lösung mit wählen, reduzieren, ToStream und 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 
    ) 
) 
Verwandte Themen