해시

2012-01-27 2 views
2
[[{"Postponed"=>10}], [{"Low"=>3}], [{"Medium"=>4}], [{"High"=>5}]] 

의 배열로 작업하는 방법을 내가 특정 값에 해당하는 값을 얻을 수있는 방법 배열해시

입니다.

높음은 5를 반환합니다. 또는 해시 배열을 배열로 변환하여 검색이 용이 해지는 방법

find_all { |v| v['name'] == "Low" } 

을하지만 말한다 :

나는 시도

cant convert String to Integer 

은 몇 가지 지침이 약

+0

최상의 솔루션 (IMHO)은 구조가 생성되는 방식을 변경하는 것입니다. 그렇게 할 능력이 있습니까? –

+0

예 마크 할 수있는 능력이 있습니다. 저를 통해 안내해 주시겠습니까? –

+0

보통 해시와 같은 냄새가납니다 :'status = { "연기 된"=> 10, "낮음"=> 3, "보통"=> 4, "높음"=> 5} – dgasper

답변

1

당신이있는 경우처럼 일부 코드 :

hash = array.inject({}) {|h, e| h.merge(e.first) } 
# => {"Postponed"=>10, "Low"=>3, "Medium"=>4, "High"=>5} 

그래서 당신은 쉽게 '낮은'값을 찾을 수 있습니다 : 다음

array = [[{"Postponed"=>10}], [{"Low"=>3}], [{"Medium"=>4}], [{"High"=>5}]] 

루비 해시로 돌려

hash['Low'] 
# => 3 

편집 : 마크 토마스의 대답은 꽤 훌륭합니다. 같은 일을하기 때문에 주사보다 짧습니다. 내가 대답하기 전에 그는 그것을 썼다. Nice))

0

방법을 제공하십시오?

arr = [ 
    [{"Postponed"=>10}], 
    [{"Low"=>3}], 
    [{"Medium"=>4}], 
    [{"High"=>5}] 
    ] 
    arr1 = [] 

    arr.each{|a| 
    arr1.push(a[0]) 
    } 

당신이 정말로 당신이 그렇게 좋아 할 거라고 하나의 해시 싶어 궁금했지만 :

myHash = {} 

    arr.each{|a| 
    a[0].each{|b, c| 
     myHash[b] = c 
    } 
    } 

그런 다음 일반적인 경우 myHash["Postponed"]

+0

그리고 arr1에서 key에 대한 값을 얻는 방법은 무엇입니까? –

+0

나는 그것을 깨달았다. 나는 당신이 해쉬를 사용하는 것이 더 나을 것이라고 생각한다. 처음에는 배열을 요청했기 때문에 arr1 만 제공했습니다. – SimonMayer

+0

빠른 응답을 위해 thnx Simon! –

1

처럼 액세스 할을 해시는 고유하지 않으므로 색인 생성을 통해 선택하지 않고 필터링해야합니다. 예를 들어, 당신이이 있다고 가정 해 봅시다 :

arr = [[{:apple => 'abc'}], [{:banana => 'def'}], [{:coconut => 'ghi'}]] 
# => [[{:apple=>"abc"}], [{:banana=>"def"}], [{:coconut=>"ghi"}]] 

지금의 당신이 :coconut 키에 어떤 해시에 해당하는 가치를한다고 가정하자. 그런 다음 사용하십시오 :

arr.flatten.map { |h| h[:coconut] }.compact 
# => ["ghi"] 

그러면 답변 목록이 제공됩니다. 이 경우 일치하는 키가 하나뿐이므로 배열에 항목이 하나뿐입니다. 했다 다른 해시가 있다면 : 거기에 코코넛 키를, 다음과 같은 거라고 : 전체에

# => ["ghi", "jkl", "mno"] 

을하지만, 그것은이 아주 특별한 데이터 구조입니다. 구조를 제어하는 ​​경우 해시가 아닌 원하는 방식으로 현명한 응답을 반환 할 수있는 객체 사용을 고려해야합니다.

+0

음, 많이 thnx @ 존 .. 그게 효과가있어. 그 구조를 어떻게 바꿀 지 말해 줄 수 있어요. 귀하의 예를 들어, 나는이 같은 몇 가지로 arr 변환 싶어요 ({: 사과 => 'abc'}, {: banana => 'def'}] .. 나는 해시의 배열 대신 일반적인 해시를 의미합니다 –

+0

예 여전히 해시 배열입니다. (원래의 구조는 해쉬 배열의 배열입니다.)'arr.flatten'을 사용하여 방금 설명한 것을 얻을 수 있습니다. –

0

원래 배열에서 #flatten으로 전화하면됩니다. 그러면 해시 배열을 얻을 수 있습니다. 내 생각에 네가 정말로 원했던 것은 단지 하나의 해시 일 뿐이다.

1.8.7 :006 > [[{"Postponed"=>10}], [{"Low"=>3}], [{"Medium"=>4}], [{"High"=>5}]].flatten 
=> [{"Postponed"=>10}, {"Low"=>3}, {"Medium"=>4}, {"High"=>5}] 

나는 원래 구조를 얻기 위해 무엇을하고 있습니까? 그것은 바뀔 수 있습니까?

+0

thnx Thanatos !! –

9

효과적인 쿼리를 위해 단일 해시를 만드는 방법은 어떻습니까?

arr.flatten.reduce(:merge) 

#=> {"Postponed"=>10, "Low"=>3, "Medium"=>4, "High"=>5} 
+0

thnx 마크, 흠 대답 유용했습니다 :) –