2013-04-22 2 views
4

해시 배열을 필터링하고 순서를 변경하려고합니다. 필터와 순서는 해시의 "slug" 키의 값을 나타내는 다른 문자열 배열에 의해 정의됩니다. 결과 배열은 "slug" 키에 대한 값이 슬러그 배열에 포함되어 있고 같은 순서로 정렬 된 해시 만 포함해야합니다.배열 키로 해시 배열을 주문하십시오.

data = [ 
    { 
    "slug" => "lemon", 
    "label" => "Lemon Label" 
    }, 
    { 
    "slug" => "table", 
    "label" => "Table Label" 
    }, 
    { 
    "slug" => "peach", 
    "label" => "Peach Label" 
    }, 
    { 
    "slug" => "strawberry", 
    "label" => "Strawberry Label" 
    }, 
    { 
    "slug" => "bread", 
    "label" => "Bread Label" 
    }, 
    { 
    "slug" => "orange", 
    "label" => "Orange Label" 
    } 
] 

하고 두 번째 배열 : 나뿐만 첫 번째 배열이 있다면 내가 얻을 수 있었다

result = [ 
    { 
    "slug" => "orange", 
    "label" => "Orange Label" 
    }, 
    { 
    "slug" => "lemon", 
    "label" => "Lemon Label" 
    }, 
    { 
    "slug" => "strawberry", 
    "label" => "Strawberry Label" 
    } 
] 

: 다음

ordered_keys = ["orange", "lemon", "strawberry"] 

을, 결과는이 같은 배열이 이 필터 기능은 다음과 같습니다.

result = data.select{|x| ordered_keys.include? x.slug} 

하지만 주문한 것을 얻기 위해 현명한 방법을 찾을 수 없습니다. 어떤 아이디어?

답변

11

주문한 키 배열을 해당 해시로 변환하려면 map을 사용하십시오. map에 대한 입력 배열의 순서는 출력 배열의 순서를 정의합니다.

ordered_keys.map{|k| data.find{|h| h["slug"] == k}} 
+0

예! 그게 바로 제가 찾던 것입니다. 결과를 얻는 현명하고 간결한 방법. 굉장해! –

관련 문제