2014-12-11 2 views
0

페이스 북에서 중첩 해시를 얻고 있습니다. 내부에는 더 많은 해시가 있고 그 반대로 배열이 있습니다.중첩 해시로 여러 객체 찾기

이제 깊이 중첩 된 모든 해시가 있는지 찾으려고합니다.

내 경우에는 키 "태그"가있는 모든 값을 검색 한 다음 배열로 밀어 넣습니다.

"Find key/value pairs deep inside a hash containing an arbitrary number of nested hashes and arrays"에 고유 키에 대한 해결책을 찾았습니다.

키가 고유하지 않고 모든 결과를 배열로 푸시하는 경우 어떻게해야합니까?

편집 : 여기

내가 페이스 북의 그래프 API에서 얻고 예제 반응이다.

{"albums"=>{"data"=>[{"id"=>"1406826642942218", 
"created_time"=>"2014-12-11T10:54:13+0000", 
"photos"=>{"data"=>[{"created_time"=>"2014-12-11T10:54:13+0000", 
"id"=>"1406826626275553"}], 
"paging"=>{"cursors"=>{"before"=>"MTQwNjgyNjYyNjI3NTU1Mw==", "after"=>"MTQwNjgyNjYyNjI3NTU1Mw=="}}}}, 
{"id"=>"1406825849608964", 
"created_time"=>"2014-12-11T10:52:34+0000", 
"photos"=>{"data"=>[{"created_time"=>"2014-12-11T10:52:34+0000", 
"id"=>"1406825782942304"}], 
"paging"=>{"cursors"=>{"before"=>"MTQwNjgyNTc4Mjk0MjMwNA==", "after"=>"MTQwNjgyNTc4Mjk0MjMwNA=="}}}}, 
{"id"=>"1405097859781763", 
"created_time"=>"2014-12-08T14:50:51+0000" 
, "photos"=>{"data"=>[{"created_time"=>"2014-12-08T14:51:12+0000", "id"=>"1405097983115084"}], 
"paging"=>{"cursors"=>{"before"=>"MTQwNTA5Nzk4MzExNTA4NA==", "after"=>"MTQwNTA5Nzk4MzExNTA4NA=="}}}}, 
{"id"=>"1392256877732528", 
"created_time"=>"2014-11-17T14:37:00+0000", 
"photos"=>{"data"=>[{"created_time"=>"2014-12-08T14:24:41+0000", 
"id"=>"1405084986449717"}, 
{"tags"=>{"data"=>[{"id"=>"100007516267052", 
"name"=>"Dorothy Amgeafbfgjeb Qinman", 
"created_time"=>"2014-11-17T14:37:12+0000", 
"x"=>46.604215456674, "y"=>72.330827067669}, 
{"id"=>"100007456544855", 
"name"=>"Richard Amgdefeddhee Carrierosen", 
"created_time"=>"2014-11-17T14:37:11+0000", 
"x"=>45.433255269321, "y"=>48.571428571429}, 
{"id"=>"100008446877693", 
"name"=>"Karen Amhddfhggfic Chaison", 
"created_time"=>"2014-11-17T14:37:09+0000", 
"x"=>49.414519906323, "y"=>31.578947368421}], 
"paging"=>{"cursors"=>{"before"=>"MTAwMDA3NTE2MjY3MDUy", "after"=>"MTAwMDA4NDQ2ODc3Njkz"}}}, 
"created_time"=>"2014-11-17T14:37:01+0000", 
"id"=>"1392256757732540"}], 
"paging"=>{"cursors"=>{"before"=>"MTQwNTA4NDk4NjQ0OTcxNw==", "after"=>"MTM5MjI1Njc1NzczMjU0MA=="}}}}], 
"paging"=>{"cursors"=>{"after"=>"MTM5MjI1Njg3NzczMjUyOA==", "before"=>"MTQwNjgyNjY0Mjk0MjIxOA=="}}}, 
"id"=>"100008446877693"} 

은 내가 얻고 싶은 것은이 부분

{"tags"=>{"data"=>[{"id"=>"100007516267052", 
    "name"=>"Dorothy Amgeafbfgjeb Qinman", 
    "created_time"=>"2014-11-17T14:37:12+0000", 
    "x"=>46.604215456674, "y"=>72.330827067669}, 
    {"id"=>"100007456544855", 
    "name"=>"Richard Amgdefeddhee Carrierosen", 
    "created_time"=>"2014-11-17T14:37:11+0000", 
    "x"=>45.433255269321, "y"=>48.571428571429}, 
    {"id"=>"100008446877693", 
    "name"=>"Karen Amhddfhggfic Chaison", 
    "created_time"=>"2014-11-17T14:37:09+0000", 
    "x"=>49.414519906323, "y"=>31.578947368421}], 

입니다 많은 사진 그들에 태그가 방식에 따라 여러 위치에있을 수있다.

이 내용이 더 분명해지기를 바랍니다.

+1

이 중첩 해시와 원하는 출력의 예를 알려주십시오. – Anthony

+0

작업 할 항목이 없습니다. 최소한의 입력 샘플, 예상 출력 샘플 및보고있는 문제점을 나타내는 글쓰기 시도의 최소한의 예가 필요합니다. 그것없이 당신의 질문은 닫힐 수 있습니다. –

+0

중첩 해시를 제공하는 정보는 무엇입니까? 그 질문은 아주 분명했다. – 7stud

답변

1
def nested_hash_values(obj,key) 
    r = [] 
    if obj.is_a?(Hash)   
    r.push(obj[key]) if obj.key?(key) 
    obj.each_value { |e| r += nested_hash_values(e,key) } 
    end 
    if obj.is_a?(Array) 
    obj.each { |e| r += nested_hash_values(e,key) } 
    end 
    r 
end 

a = {"foo"=>["bar", "x", {"bar"=>["hello", {"foo"=>"world"}, "world!"], "foo"=>"BAR!"}, "enough?"], "bar"=>"foo"} 
nested_hash_values(a, "foo") 
=> [["bar", "x", {"bar"=>["hello", {"foo"=>"world"}, "world!"], "foo"=>"BAR!"}, "enough?"], "BAR!", "world"] 

은 주어진 키에 대해 모든 값을 가진 배열을 반환해야합니다.

각 블록에 if e.is_a?(Array) || e.is_a?(Hash)을 추가 할 수 있습니다. 이렇게하면 불필요한 메소드 호출을 피할 수 있고 함수의 속도가 빨라지지만 코드를 추가 할 수 있습니다.

+0

고마워. 이것은 정확히 내가 필요한 것입니다 :) –