Ruby Arrays: เลือก () รวบรวม () และแผนที่ ()


107

ไวยากรณ์สำหรับการแมป:

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}

เพียงแค่ส่งคืนเท็จจำนวนมากจากนั้นเมื่อฉันใช้แบบเดียวกันเพียงแค่เปลี่ยนแผนที่เพื่อเลือกฉันได้รับ:

[]

หากคุณมองใกล้ ๆ ดูเหมือนว่ามันเป็นแฮชมากมาย
เอมิลี่

@Emily: จริงมากฉันเพิ่งรู้ตัว ตัวอย่างโค้ดสุดท้ายทำให้ฉันคิดเป็นอย่างอื่นเพราะ:qtyไม่ปรากฏที่นั่นด้วยซ้ำ
Niklas B.

คำตอบ:


131

ดูเหมือนว่าdetailsจะเป็นชุดของแฮช ดังนั้นitemภายในบล็อกของคุณจะเป็นแฮชทั้งหมด ดังนั้นในการตรวจสอบ:qtyคีย์คุณต้องทำสิ่งต่อไปนี้:

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

ซึ่งจะให้รายการทั้งหมดที่:qtyคีย์ไม่ใช่สตริงว่างเปล่า

เอกสารการคัดเลือกอย่างเป็นทางการ


26

แก้ไข:ฉันเพิ่งรู้ว่าคุณต้องการกรองdetailsซึ่งเป็นชุดของแฮช ในกรณีนั้นคุณสามารถทำได้

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

โครงสร้างข้อมูลภายในนั้นไม่ใช่ Array แต่เป็น Hash คุณสามารถใช้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? }

โปรดทราบว่านี่คือ Ruby 1.9 หากคุณต้องรักษาความเข้ากันได้กับ 1.8 คุณสามารถทำได้:

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

@ingalcala: ฉันเพิ่งรู้ว่าคำตอบของฉันไม่ใช่สิ่งที่คุณต้องการจริงๆ โปรดตรวจสอบการแก้ไขของฉันสำหรับวิธีการกรองdetailsอาร์เรย์เอง
Niklas B.

9

เมื่อจัดการกับแฮช{}ให้ใช้ทั้งคีย์และค่าในบล็อกภายในไฟล์||.

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

=>[false, false, true, false, false]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.