สมมติว่าคุณต้องการเปรียบเทียบสองอาร์เรย์ ทีละองค์ประกอบ เพื่อหาความแตกต่าง
หรือบางทีคุณอาจต้องการหาตัวเลขที่ใหญ่ที่สุดในทุกดัชนี หรือคุณเพียงแค่ต้องการรวมรายการคีย์และรายการค่าเพื่อสร้างแฮช...
… "วิธีที่ยาก" ในการทำเช่นนี้จะมีลักษณะเช่นนี้
ตัวอย่าง :
a = [1,2,3,4,5] b = [1,2,3,6,8] c = a.map.with_index { |_, idx| [a[idx], b[idx]] } # [[1, 1], [2, 2], [3, 3], [4, 6], [5, 8]]
ได้งานแต่ไม่สวยใช่มั้ย
นอกจากนี้ คุณต้องหยุดคิดสักครู่เพื่อทำความเข้าใจกับสิ่งที่เกิดขึ้น
นี่คือที่มาของ Array#zip (เช่น Enumerable#zip)!
ตัวอย่าง :
a = [1,2,3,4,5] b = [1,2,3,6,8] c = a.zip(b) # [[1, 1], [2, 2], [3, 3], [4, 6], [5, 8]]
อ้า! …ดีขึ้นมาก
ไม่เห็นด้วยเหรอ
หากเราคุ้นเคยกับ zip
เราจะเข้าใจทันทีว่าเกิดอะไรขึ้น และหากเราไม่อ่าน การอ่านเอกสารอย่างรวดเร็ว (หรือดีกว่านี้ บทความนี้!) จะอธิบายได้
ข้อดีอีกอย่างของการใช้ zip
คือเราสามารถโยงมันกับวิธีการนับอื่นๆ ได้อย่างง่ายดาย
เช่น วิธีการนับ :
a = [1,2,3,4,5] b = [1,2,3,6,8] c = a.zip(b).count { |a,b| a == b } # 3
รหัสนี้ส่งคืนการนับจำนวนองค์ประกอบที่เหมือนกัน &ในตำแหน่งเดียวกัน
เคล็ดลับอีกอย่างที่คุณสามารถใช้ได้ดังที่ได้กล่าวไว้ก่อนหน้านี้คือการรวมรายการคีย์และค่าต่างๆ เข้าด้วยกันเพื่อสร้างแฮช
ตัวอย่าง :
a = %w(bacon coconut walnuts) b = [100, 200, 300] a.zip(b).to_h # {"bacon"=>100, "coconut"=>200, "walnuts"=>300}
ต้องการตัวอย่างอื่นหรือไม่
ได้เลย!
นี่เลย :
letters = Array('a'..'z') shift = 3 translation_map = letters.zip(letters.rotate(shift)).to_h "hello".chars.map { |ch| translation_map[ch] }.join
นี่เป็นการนำอัลกอริธึมซีซาร์มาใช้อย่างแฟนซี
สรุป
คุณได้เรียนรู้เกี่ยวกับ Array#zip
วิธีซึ่งช่วยให้คุณ "รวม" สองอาร์เรย์และทำเทคนิคเจ๋ง ๆ กับสิ่งนั้น 🙂
หากคุณชอบโพสต์นี้ อย่าลืมแชร์ บนโซเชียลเน็ตเวิร์กที่คุณชื่นชอบเพื่อให้คนอ่านได้มากขึ้น!