2012-07-27 64 views
20

我有一个数组的数组:在Ruby中选择数组数组中的一列中的所有元素?

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

而且我想只包含每个阵列的第三列的数组:

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

我会怎么做呢?

我想键入类似:

arr[][2] 

但思维更红宝石般的,我想:

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

但这返回整行。

+1

您的意思是'arr.collect {| R | r [2]}'? – waldrumpus 2012-07-27 13:17:16

+0

你的'select'语句取第三个元素所有的行,这就是为什么你没有得到预期的结果。 – 2012-07-27 13:22:12

回答

35

你想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

或Rails/ActiveSupport的'arr.map(&:third)'。 – 2012-07-27 13:20:29

+1

''first''和'#last'在普通红宝石中可用 – akostadinov 2016-01-15 08:55:45

1

使用地图或收集 arr.map {| A | A [2]}

+1

'map'之前不需要'each'。 – 2012-07-27 13:20:51

13

另一种方法:

arr.transpose[2] 
+0

对于非常大的矩阵,可能'转置'比'map {| r | r [2]}解决方案? – 2012-07-27 19:42:37

+0

@Jared Beck记忆我会说是,更贵。 – steenslag 2012-07-27 20:40:27

+0

谢谢,我很喜欢这个,因为你可以在没有块的情况下使用它。如果还需要在第一列和第二列(就像我一样),则可以使用转置来一步设置“转置”矩阵。 – Ninjaxor 2015-05-02 19:26:03

相关问题