2017-11-20 3 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() 우리가 목록의 모든 요소를 ​​반복 할 수 있습니다. 즉, 최상위 수준의 '노드'에 여러 항목이있는 경우 모든 항목이 Google 로직에 따라 필터링됩니다.

참고 : 코드가 올바르지 않으므로지도에 "reviews" => ...을 입력해야한다고 생각했습니다.

+0

실제로 복사/붙여 넣기 오류가 있었기 때문에 올바른 구문으로 내 질문을 업데이트했습니다. 답변 해주셔서 감사합니다! – Soler

관련 문제