2017-11-20 1 views
0

私はGitHub GraphQL APIを使用しており、応答データの一部をフィルタリングする必要がありますが、それは非常にネストされています。以下は、私が扱っている応答の抜粋の例です。リスト内で深くネストされたマップをフィルタリングするにはどうすればよいですか?

%{"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"} 
     ] 
     } 
    }] 
    } 
} 

私が達成したいのは、ログインに基づいてレビューアを除外することです。どのようにノードのマップのいくつかをフィルタリングして、次のような結果に終わることができますか?

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

これは最初の有効なエリキシ用語ではありません。 – mudasobwa

答えて

2

これは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 

出力:

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

Access.all()は更新をしている間、私たちは、リストのすべての要素を反復処理することができます。つまり、最上位の「ノード」に複数のアイテムがある場合、それらのアイテムはすべてロジックに従ってフィルタリングされます。

注:あなたのコードは無効な構文だったので、"reviews" => ...を地図に書き込むことを前提としていました。

+0

実際にコピー/ペーストエラーが発生したため、正しい構文になるように質問を更新しました。答えをありがとう! – Soler

関連する問題