रूबी एरे: चयन (), इकट्ठा (), और मानचित्र ()


106

मैपिंग के लिए वाक्य रचना:

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"}

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

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

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

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

[]

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

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

जवाबों:


131

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

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

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

आधिकारिक चयन प्रलेखन


26

संपादित करें: मुझे एहसास हुआ कि आप फ़िल्टर करना चाहते हैं 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? }]

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

9

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

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

=>[false, false, true, false, false]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.