Map เป็นเมธอด Ruby ที่ใช้กับ Arrays, Hashes และ Ranges ได้
การใช้งานหลักของ map คือ TRANSFORM ข้อมูล
ตัวอย่าง:
กำหนดอาร์เรย์ของ strings คุณวนทุก string และทำให้ทุกตัวอักษรเป็น UPPERCASE
หรือหากคุณมีรายการออบเจกต์ User…
คุณสามารถ แปลง พวกมันเป็นรายการ email addresses, phone number หรือ attribute ใดๆ ที่นิยามบนคลาส User
มา看看รายละเอียดกัน!
Ruby Map Syntax
ไวยากรณ์ของ map 长这样:
array = ["a", "b", "c"]
array.map { |string| string.upcase } # ["A", "B", "C"]
ก่อนอื่นคุณมีอาร์เรย์ แตอาจเป็น hash หรือ range ก็ได้
จากนั้นเรียก map พร้อม block
Block คือสิ่งในวงเล็บ { ... } ภายใน block คุณบอกว่าอยาก transform ทุก element ในอาร์เรย์อย่างไร 基本上是 function
เกิดอะไรหลังจากเรียก map?
Map คืนอาร์เรย์ใหม่ พร้อมผลลัพธ์
มันไม่เปลี่ยนต้นฉบับ
หากอยากเปลี่ยนอาร์เรย์ต้นฉบับ ใช้ map!
ตัวอย่าง Ruby Map
นี่คือตัวอย่างที่อาจมีประโยชน์
คูณตัวเลขสองเท่า:
array = [1,2,3]
array.map { |n| n * 2 } # [2, 4, 6]
แปลง strings เป็น integers:
array = ["11", "21", "5"]
array.map { |str| str.to_i } # [11, 21, 5]
แปลง hash values เป็น symbols:
hash = { bacon: "protein", apple: "fruit" }
hash.map { |k,v| [k, v.to_sym] }.to_h # {:bacon=>:protein, :apple=>:fruit}
เกี่ยวกับตัวอย่าง hash นี้:
คุณจะพบว่ามีสองอาร์กิวเมนต์แทนหนึ่ง นั่นเพราะ hash element ประกอบด้วย key และ value
จากนั้นผมคืนอาร์เรย์ใหม่พร้อม key และ values ที่ transform แล้ว
ขั้นตอนสุดท้ายคือแปลงกลับเป็น hash
Ruby Map vs Each
ความแตกต่างระหว่าง map และ each คืออะไร?
Each เหมือน version primitive กว่าของ map…
มันให้ทุก element ให้คุณทำงาน แต่ไม่ collect results
Each คืน original object ที่ไม่เปลี่ยนแปลงเสมอ
ในขณะที่ map ทำสิ่งเดียวกัน แต…
มันคืนอาร์เรย์ใหม่พร้อม elements ที่ transform แล้ว
ตัวอย่าง:
array.each { |n| n * 2 } # [1, 2, 3]
array.map { |n| n * 2 } # [2, 4, 6]
Ruby Map vs Collect
Map และ Collect เป็นเมธอดเดียวกันทุกประการ
ชื่อต่างกันสำหรับสิ่งเดียวกัน!
ควรใช้ตัวไหน?
หากอ่าน open-source projects คุณจะพบว่า version ที่ common ที่สุดคือ map
ใช้ตัวนั้น
วิธีใช้ Map พร้อม Index
หากต้องการ index พร้อม values ใช้เมธอด with_index
ตัวอย่าง:
array = %w(a b c)
array.map.with_index { |ch, idx| [ch, idx] } # [["a", 0], ["b", 1], ["c", 2]]
Bonus tip:
คุณส่งพารามิเตอร์ให้ with_index ได้ หากไม่อยากเริ่มจาก index 0
Ruby Map Shorthand (map &)
คุณใช้ shorthand version สำหรับ map ได้เมื่อเรียกเมธอดที่ ไม่ต้องการอาร์กิวเมนต์
ตัวอย่าง:
["11", "21", "5"].map(&:to_i)
ตัวอย่าง:
["orange", "apple", "banana"].map(&:class)
Syntax & นี้ไม่จำกัดแค่ map ใช้กับ enumerable methods อื่นๆ ได้
Map Method Mindmap

วิดีโอสอน
สรุป
คุณเรียนรู้เกี่ยวกับ Ruby map method และวิธีใช้งานแล้ว! ยังเรียนรู้ความแตกต่างระหว่าง each, map และ collect
หากชอบบทความนี้แชร์ให้เพื่อน Ruby ของคุณ 🙂
ขอบคุณที่อ่าน!