2012-03-28 29 views
62

वाक्य रचना:रूबी सरणी: (चुनें), इकट्ठा(), और नक्शा() मानचित्रण के लिए

a = ["a", "b", "c", "d"]  #=> ["a", "b", "c", "d"] 
a.map {|item|"a" == item}  #=> [true, false, false, false] 
a.select {|item|"a" == item} #=> ["a"] 

सवाल यह है कि के बारे में है, तो मेरे पास है:

irb(main):105:0> details[1] 
=> {:sku=>"507772-B21", :desc=>"HP 1TB 3G SATA 7.2K RPM LFF (3 .", :qty=>"", 
:qty2=>"1", :price=>"5,204.34 P"} 

मैं हर प्रविष्टि जो हटाना चाहते हैं इस सरणी पर एक खाली qty मान है, या केवल कुछ मूल्य वाले लोगों का चयन करें।

मैंने कोशिश की:

details.map {|item|"" == item} 

सिर्फ झूठे का एक बहुत देता है। और फिर जब मैं एक ही बस परिवर्तन मानचित्र का उपयोग का चयन करने के मैं:

[] 
+0

यदि आप बारीकी से देखते हैं, तो ऐसा लगता है कि यह हैश की एक सरणी है – Emily

+0

@Emily: बहुत सच है, मुझे बस एहसास हुआ। आखिरी कोड नमूने ने मुझे अन्यथा सोचा, क्योंकि ': qty' भी वहां दिखाई नहीं देता है। –

उत्तर

67

ऐसा लगता है कि details तरह हैश की एक सरणी है। इसलिए item आपके ब्लॉक के अंदर पूरे हैश होगा। इसलिए, :qty कुंजी जाँच करने के लिए, आप कुछ इस तरह का कर चाहते हैं:

details.select{ |item| item[:qty] != "" } 

कि आप सभी आइटम जहां :qty कुंजी एक खाली स्ट्रिंग नहीं है दे देंगे।

6

जब एक हैश {} के साथ काम कर, || अंदर ब्लॉक करने के लिए दोनों कुंजी और मान का उपयोग करें।

details.map {|key,item|"" == item} 

=>[false, false, true, false, false] 
16

संपादित करें: मैं सिर्फ महसूस किया आप फ़िल्टर करना details, जो हैश की एक सरणी है चाहता हूँ। उस मामले में तुम कर सकते हो

details.reject { |item| item[:qty].empty? } 

आंतरिक डेटा संरचना अपने आप में एक सरणी है, लेकिन एक हैश नहीं है। आप यहां select उपयोग कर सकते हैं, लेकिन ब्लॉक प्रमुख और इस मामले में मूल्य दिया जाता है:

irb(main):001:0> h = {:sku=>"507772-B21", :desc=>"HP 1TB 3G SATA 7.2K RPM LFF (3 .", :qty=>"", :qty2=>"1", :price=>"5,204.34 P"} 
irb(main):002:0> h.select { |key, value| !value.empty? } 
=> {:sku=>"507772-B21", :desc=>"HP 1TB 3G SATA 7.2K RPM LFF (3 .", 
    :qty2=>"1", :price=>"5,204.34 P"} 

या reject, जो select का उल्टा होता है का उपयोग कर (शामिल नहीं सभी आइटम है जिसके लिए किसी स्थिति रखती है):

h.reject { |key, value| value.empty? } 

ध्यान दें कि यह रूबी 1.9 है। आप 1.8 के साथ संगतता बनाए रखने के लिए है, तो आप कर सकता है:

Hash[h.reject { |key, value| value.empty? }] 
+0

@ingalcala: मुझे अभी एहसास हुआ कि मेरा जवाब वास्तव में आपको आवश्यक नहीं है। कृपया 'विवरण' सरणी को फ़िल्टर करने के तरीके के लिए मेरा संपादन जांचें। –

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