2012-07-27 79 views
20

Tôi có một mảng của các mảng:Chọn tất cả các phần tử từ một cột trong một mảng các mảng trong Ruby?

arr = [["Foo1", "Bar1", "1", "W"], 
["Foo2", "Bar2", "2", "X"], 
["Foo3", "Bar3", "3", "Y"], 
["Foo4", "Bar4", "4", "Z"]] 

Và tôi muốn một mảng chỉ chứa các cột thứ ba của mỗi mảng:

res = ["1", "2", "3", "4"] 

Làm thế nào tôi sẽ làm điều đó?

Tôi muốn gõ một cái gì đó như:

arr[][2] 

Nhưng nghĩ nhiều hơn Ruby-như, tôi đã cố gắng:

arr.select{ |r| r[2] } 

nhưng điều này trả lại toàn bộ hàng.

+1

Ý của bạn là 'arr.collect {| r | r [2]} '? – waldrumpus

+0

Câu lệnh 'select' của bạn lấy tất cả các hàng mà phần tử thứ ba là sự thật, đó là lý do tại sao bạn không nhận được kết quả mong đợi. –

Trả lời

35

Bạn muốn arr.map {|row| row[2]}

arr = [["Foo1", "Bar1", "1", "W"], 
["Foo2", "Bar2", "2", "X"], 
["Foo3", "Bar3", "3", "Y"], 
["Foo4", "Bar4", "4", "Z"]] 

arr.map {|row| row[2]} 
# => ["1", "2", "3", "4"] 
+7

Hoặc 'arr.map (&: third)' với Rails/ActiveSupport. –

+1

cũng '# first' và' # last' có sẵn trong đồng bằng ruby ​​ – akostadinov

1

Sử dụng bản đồ hoặc thu thập arr.map {| a | a [2]}

+1

Không cần 'each' trước' map'. –

13

Một phương pháp:

arr.transpose[2] 
+0

Đối với các ma trận rất lớn, có thể 'transpose' đắt hơn 'map {| r | r [2]} 'giải pháp? –

+0

@Jared Beck Memorywise Tôi muốn nói có, đắt hơn. – steenslag

+0

Cảm ơn, tôi thích cái này rất nhiều vì bạn có thể sử dụng nó mà không có khối. Và nếu có nhu cầu nhận được ở cột đầu tiên và thứ hai quá (như tôi), có thể sử dụng transpose để thiết lập ma trận 'transposed' tất cả trong một bước. – Ninjaxor

Các vấn đề liên quan