रूबी हैश टू एरे वैल्यूज़


118

मेरे पास यह है:

hash  = { "a"=>["a", "b", "c"], "b"=>["b", "c"] } 

और मैं इसे प्राप्त करना चाहता हूं: [["a","b","c"],["b","c"]]

ऐसा लगता है कि यह काम करना चाहिए लेकिन यह नहीं है:

hash.each{|key,value| value}
=> {"a"=>["a", "b", "c"], "b"=>["b", "c"]} 

कोई सुझाव?


नीचे दिए गए उत्तर सही हैं ( hash.valuesबेहतर IMO होने के नाते)। लेकिन मैं इंगित करना चाहता था कि जब आप Hash#eachइसे ब्लॉक प्रदान करते हैं तो यह हैश का पूरा मूल्य वापस कर देगा। यदि आप प्रत्येक आइटम पर एक ऑपरेशन करना चाहते हैं और एक सरणी, उपयोग Hash#collectया उसके उपनाम के रूप में लौटाते हैं Hash#mapयहाँ Enumerables पर अधिक सामान ।
ब्रिकम

3
यह सवाल अजीब रूप से परिचित लग रहा है ... मुझे आश्चर्य है कि अभी एक ही होमवर्क असाइनमेंट पर कितने लोग काम कर रहे हैं।
पीटर ब्राउन

जवाबों:


260

साथ ही, थोड़ा सरल ...।

>> hash = { "a"=>["a", "b", "c"], "b"=>["b", "c"] }
=> {"a"=>["a", "b", "c"], "b"=>["b", "c"]}
>> hash.values
=> [["a", "b", "c"], ["b", "c"]]

रूबी ने यहां डाॅ


3
+! निफ्टी! मैं एक प्रतिस्पर्धात्मक उत्तर (उपयोग करने map) के बावजूद उत्थान करूँगा , क्योंकि मुझे यह बहुत पसंद है!
माइकल ड्यूरेंट

2
Hash#valuesन केवल सरल है, बल्कि अधिक कुशल है। तुलना time ruby -e '(1..1000000).reduce({}){|h,i| h.store i,i; h}.values'के साथtime ruby -e '(1..1000000).reduce({}){|h,i| h.store i,i; h}.map{|k,v| v}'
jordanbtucker

+1 (आपके कोड की कोशिश करने के बाद आश्चर्यजनक रूप से चकित) मैंने एक दिन बिताया है जिसमें कई विधियों का उपयोग करके सूचकांक को हटाने का कोई भाग्य नहीं है ... सभी मैं कह सकता हूं कि आपका बहुत बहुत धन्यवाद !!! : D
रोमियों -.३--३९

2
क्या कुंजी सही क्रम में छपी हैं, जो वे घटित होती हैं?
स्टैक 1

43

मै इस्तेमाल करूंगा:

hash.map { |key, value| value }

3
मैंने इसे कम नहीं किया, लेकिन यह इसके बराबर जटिल है Hash#values
मार्क थॉमस

1
हां, मैंने रे के जवाब को भी गलत ठहराया। जब मैं भी इसे पसंद करता हूं, तो मैं एक प्रतिस्पर्धी उत्तर को खुश करता हूं।
माइकल ड्यूरेंट

3
मुझे लगता है कि हम यहां प्रतिस्पर्धा नहीं कर रहे हैं बल्कि एक दूसरे की मदद कर रहे हैं, है ना? :)
witkacy26

वास्तव में मैं क्या देख रहा था जब यह मूल्यों की कुंजी के रूप में उपयोग करते हुए हैश से एक सरणी बनाने की कोशिश कर रहा था। धन्यवाद :)
Fabian Leutgeb

उपयोगी है जब आपको उसी समय चाबियों के साथ कुछ तर्क करने की आवश्यकता होती है ।
क्रिस क्रेफ़िस

23
hash.collect { |k, v| v }
#returns [["a", "b", "c"], ["b", "c"]] 

Enumerable#collectएक ब्लॉक लेता है, और एन्यूमरेबल के प्रत्येक तत्व पर एक बार ब्लॉक चलाने के परिणामों की एक सरणी देता है। तो यह कोड केवल कुंजियों को अनदेखा करता है और सभी मानों की एक सरणी लौटाता है।

Enumerableमॉड्यूल बहुत भयानक है। इसे अच्छी तरह से जानने से आप बहुत समय और बहुत सारे कोड बचा सकते हैं।


2
यह मत भूलो, @Ray Toal के उत्तर की तरह, hash.valuesअंततः यहाँ सही उत्तर है।
तदमन

या hash.map(&:second):)
जाप हागमंस


4

यह उतना ही सरल है

hash.values
#=> [["a", "b", "c"], ["b", "c"]]

यह हैश से मानों के साथ आबाद एक नई सरणी लौटाएगा

यदि आप उस नई सरणी को संग्रहीत करना चाहते हैं

array_of_values = hash.values
#=> [["a", "b", "c"], ["b", "c"]]

array_of_values
 #=> [["a", "b", "c"], ["b", "c"]]

2

यह भी एक है:

hash = { foo: "bar", baz: "qux" }
hash.map(&:last) #=> ["bar", "qux"]

यह क्यों काम करता है:

&कॉल to_procवस्तु पर, और विधि के लिए एक ब्लॉक के रूप में यह गुजरता है।

something {|i| i.foo }
something(&:foo)

गहराई से स्पष्टीकरण brianstorti.com/understanding-ruby-idiom-map-with-symbol
सिल्वेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.