0

Array#zip Method

Introduce

Giả sử bạn muốn so sánh hai mảng, theo từng cặp phần tử để bạn có thể tìm thấysự khác biệt. Hoặc bạn muốn tìm giá trị lớn nhất theo từng vị trí của 2 mảng, hoặc bạn muốn hợp nhất 1 mảng key và 1 mảng value thành 1 hash. Để làm điều trên ta có thể implement như sau:

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 method

Cách trên đã giải quyết được yêu cầu, nhưng nó cũng làm chúng ta mất 1 chút thời gian để đọc hiểu xem đoạn code trên làm gì. Ruby cung cấp cho chúng ta 1 method Array#zip để làm điều này đơn giản và làm được nhiều thứ hơn. Chúng ta xem ví dụ sau:

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]]

Nếu chúng ta sử dụng và quen với zip method thì chúng ta sẽ hiểu ngay điều gì đang xảy ra.

Bên cạnh đó, sử dụng zip thì ta có thể dễ dàng kết nối với các Enumerable method khác.

a = [1,2,3,4,5]
b = [1,2,3,6,8]
 
c = a.zip(b).count { |a,b| a == b }
 
# 3

Đoạn code trên trả về chính xác có bao nhiêu phần tử giống nhau và ở cùng một vị trí.

Một kỹ thuật khác mà bạn có thể sử dụng, như tôi đã đề cập trước đó, là để hợp nhất một danh sách các key & value để xây dựng một hash.

a = %w(bacon coconut walnuts)
b = [100, 200, 300]
 
a.zip(b).to_h
 
# {"bacon"=>100, "coconut"=>200, "walnuts"=>300}

Hoặc sau đây là một ví dụ sử dụng zip để implement caesar cipher algorithm.

letters = Array('a'..'z')
shift   = 3
 
translation_map = letters.zip(letters.rotate(shift)).to_h
 
"hello".chars.map { |ch| translation_map[ch] }.join

Summary

Bạn đã biết về phương pháp Array#zip, cho phép bạn "merge" hai mảng và làm một số điều thú vị với kết qủa từ zip method. Nếu có điều gì thú vị khi sử dụng với zip method, các bạn có thể comment đóng góp. Bài viết được dịch từ:

http://www.rubyguides.com/2017/10/array-zip-method/


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí