2011-08-21 11 views
30

मैं हैश के इस सरणी है:मैं इस शेर के सरणी को कैसे समूहित कर सकता हूं?

- :name: Ben 
    :age: 18 
- :name: David 
    :age: 19 
- :name: Sam 
    :age: 18 

मैं age द्वारा उन्हें समूह की जरूरत है, ताकि वे इस तरह अंत:

array = array.group_by &:age 
:

18: 
- :name: Ben 
    :age: 18 
- :name: Sam 
    :age: 18 
19: 
- :name: David 
    :age: 19 

मैं इसे इस तरह से कर रही है की कोशिश की

लेकिन मुझे यह त्रुटि मिलती है:

NoMethodError (undefined method `age' for {:name=>"Ben", :age=>18}:Hash): 

मैं गलत क्या कर रहा हूं? मैं रेल 3.0.1 और रूबी 1.9.2 का उपयोग कर रहा

उत्तर

77

&:age मतलब यह है कि group_by विधि वस्तुओं पर age विधि बुलाना चाहिए डेटा द्वारा समूह मिलता है। यह age विधि हैश पर मौजूद वस्तुओं पर परिभाषित नहीं है।

यह काम करना चाहिए:

array.group_by { |d| d[:age] } 
2
out = {} 
array_of_hashes.each do |a_hash| 
    out[a_hash[:age]] ||= [] 
    out[a_hash[:age]] << a_hash 
end 

या

array.group_by {|item| item[:age]} 
0

के रूप में अन्य लोगों ने बताया है माणिक का Symbol#to_proc विधि शुरू हो जाती है और सरणी में प्रत्येक हैश पर age प्रणाली को बुलाती है। यहां समस्या यह है कि हैश age विधि का जवाब नहीं देते हैं।

अब हम हैश क्लास के लिए एक को परिभाषित कर सकते हैं, लेकिन शायद हम इसे प्रोग्राम में हर हैश उदाहरण के लिए नहीं चाहते हैं। इसके बजाय हम बस इतना की तरह सरणी में प्रत्येक हैश पर age विधि को परिभाषित कर सकते हैं:

array.each do |hash| 
    class << hash 
    def age 
     self[:age] 
    end 
    end 
end 

और फिर हम group_by उपयोग कर सकते हैं बस के रूप में आप पहले थे:

array = array.group_by &:age 
संबंधित मुद्दे

 संबंधित मुद्दे