11

Estoy usando Ruby on Rails 3.2.2 y Ruby 1.9.2.¿Cómo puedo "extraer" valores de una matriz multidimensional de una manera inteligente?

Dada la siguiente multidimensional Array:

[["value1", "value1_other"], ["value2", "value2_other"], ["value3", "value3_other"]] 

me gustaría obtener (nota: me gustaría "extraer" sólo el primer valor de todas las "anidados" Array s):

["value1", "value2", "value3"] 

¿Cómo puedo hacer eso de una manera inteligente?

+1

posible duplicado de [Dada una matriz A de n subconjuntos Sn, ¿cómo puedo seleccionar la matriz de Sn \ [i \] miembros en Ruby?] (Http://stackoverflow.com/questions/11120244/given-an-array-a-de-n-subarrays-sn-how-can-i-select-the-array-of-sni-members) –

+0

@ KL-7 - Tiene usted razón, pero yo no No encuentras la pregunta que vinculaste antes para publicar una nueva. – user12882

Respuesta

23

Puede usar Array#collect para ejecutar un bloque para cada elemento de la matriz externa. Para obtener el primer elemento, pase un bloque que indexa la matriz.

arr.collect {|ind| ind[0]} 

En uso:

 
arr = [["value1", "value1_other"], ["value2", "value2_other"], ["value3", "value3_other"]] 
=> [["value1", "value1_other"], ["value2", "value2_other"], ["value3", "value3_other"]] 
arr.collect {|ind| ind[0]} 
=> ["value1", "value2", "value3"] 

En lugar de {|ind| ind[0]}, puede utilizar Array#first para obtener el primer elemento de cada matriz interna:

arr.collect(&:first) 

Para la sintaxis &:first, leer "Ruby/Ruby on Rails ampersand colon shortcut".

2
>> array = [["value1", "value1_other"], ["value2", "value2_other"], ["value3", "value3_other"]] 
=> [["value1", "value1_other"], ["value2", "value2_other"], ["value3", "value3_other"]] 
>> array.map { |v| v[0] } 
=> ["value1", "value2", "value3"] 
+0

Para aclarar, no hay diferencia entre 'arr.map' y' arr.collect'. Ver http://stackoverflow.com/questions/5254732/difference-between-map-and-collect-in-ruby – forforf

1
arr = [["value1", "value1_other"], ["value2", "value2_other"], ["value3", "value3_other"]] 

Solution1 = arr.map {|elem| elem.first} 

Solution2 = arr.transpose[0] 
Cuestiones relacionadas