2017-11-20 5 views
0

Ich arbeite mit der GitHub GraphQL API und muss einige der Antwortdaten filtern, aber es ist so tief verschachtelt. Im Folgenden finden Sie ein Beispiel für die Antwort, mit der ich es zu tun habe.Wie kann ich eine tief verschachtelte Karte in einer Liste filtern?

%{"name" => "repo", 
    "pullRequests" => %{ 
    "nodes" => [%{ 
     "reviews" => %{ 
     "nodes" => [ 
      %{"author" => %{"login" => "FOO"}, "state" => "COMMENTED"}, 
      %{"author" => %{"login" => "BAR"}, "state" => "COMMENTED"}, 
      %{"author" => %{"login" => "BAR"}, "state" => "COMMENTED"}, 
      %{"author" => %{"login" => "BAR"}, "state" => "COMMENTED"}, 
      %{"author" => %{"login" => "BAR"}, "state" => "COMMENTED"}, 
      %{"author" => %{"login" => "FOO"}, "state" => "COMMENTED"}, 
      %{"author" => %{"login" => "FOO"}, "state" => "COMMENTED"}, 
      %{"author" => %{"login" => "BAR"}, "state" => "COMMENTED"}, 
      %{"author" => %{"login" => "BAR"}, "state" => "COMMENTED"} 
     ] 
     } 
    }] 
    } 
} 

Was ich erreichen möchte, ist in der Lage, Reviewer basierend auf ihrem Login zu filtern. Wie kann ich einige der Karten in Knoten filtern, um mit den folgenden zu enden?

%{"name" => "repo", 
    "pullRequests" => %{ 
    "nodes" => [%{ 
     "reviews" => %{ 
     "nodes" => [ 
      %{"author" => %{"login" => "FOO"}, "state" => "COMMENTED"}, 
      %{"author" => %{"login" => "FOO"}, "state" => "COMMENTED"}, 
      %{"author" => %{"login" => "FOO"}, "state" => "COMMENTED"}, 
     ] 
     } 
    }] 
    } 
} 
+1

Dies ist in erster Linie kein gültiger Elixierbegriff. – mudasobwa

Antwort

2

Dies ist der perfekte Anwendungsfall für update_in:

map = %{"name" => "repo", 
    "pullRequests" => %{ 
    "nodes" => [%{ 
     "reviews" => %{ 
     "nodes" => [ 
      %{"author" => %{"login" => "FOO"}, "state" => "COMMENTED"}, 
      %{"author" => %{"login" => "BAR"}, "state" => "COMMENTED"}, 
      %{"author" => %{"login" => "BAR"}, "state" => "COMMENTED"}, 
      %{"author" => %{"login" => "BAR"}, "state" => "COMMENTED"}, 
      %{"author" => %{"login" => "BAR"}, "state" => "COMMENTED"}, 
      %{"author" => %{"login" => "FOO"}, "state" => "COMMENTED"}, 
      %{"author" => %{"login" => "FOO"}, "state" => "COMMENTED"}, 
      %{"author" => %{"login" => "BAR"}, "state" => "COMMENTED"}, 
      %{"author" => %{"login" => "BAR"}, "state" => "COMMENTED"} 
     ] 
     } 
    }] 
    } 
} 

map2 = update_in(map, ["pullRequests", "nodes", Access.all(), "reviews", "nodes"], fn nodes -> 
    for %{"author" => %{"login" => "FOO"}} = node <- nodes, do: node 
end) 

IO.inspect map2 

Ausgang:

%{"name" => "repo", 
    "pullRequests" => %{"nodes" => [%{"reviews" => %{"nodes" => [%{"author" => %{"login" => "FOO"}, 
      "state" => "COMMENTED"}, 
      %{"author" => %{"login" => "FOO"}, "state" => "COMMENTED"}, 
      %{"author" => %{"login" => "FOO"}, "state" => "COMMENTED"}]}}]}} 

Access.all() lässt uns alle Elemente einer Liste durchlaufen, während das Update durchführen. Das bedeutet, wenn Ihre "Knoten" auf der obersten Ebene mehrere Elemente haben, werden alle nach unserer Logik gefiltert.

Hinweis: Ihr Code war ungültige Syntax, also nahm ich an, Sie wollten "reviews" => ... in eine Karte einpacken.

+0

Ich habe meine Frage aktualisiert, um korrekte Syntax zu sein, da ich tatsächlich einen Kopier-/Einfügefehler hatte. Danke für die Antwort! – Soler

Verwandte Themen