11

Sto usando Ruby su Rails 3.2.2 e Ruby 1.9.2.Come posso "estrapolare" i valori da una matrice multidimensionale in modo intelligente?

Dato il seguente multidimensionale Array:

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

Vorrei ottenere (nota: Vorrei "estrarre" solo il primo valore di tutti "annidati" Array s):

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

Come posso farlo in modo intelligente?

+1

possibile duplicato di [dato un array A di n sottoarray Sn, come posso selezionare l'Array di Sn \ [i \] membri in Ruby?] (Http://stackoverflow.com/questions/11120244/data-an-array-a-di-n-subarray-sn-how-can-i-select-the-array-of-sni-members) –

+0

@ KL-7 - Hai ragione, ma non l'ho Trova la domanda che hai collegato prima di pubblicarne una nuova. – user12882

risposta

23

È possibile utilizzare Array#collect per eseguire un blocco per ciascun elemento dell'array esterno. Per ottenere il primo elemento, passa un blocco che indicizza l'array.

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

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

Invece di {|ind| ind[0]}, è possibile utilizzare Array#first per ottenere il primo elemento di ciascun array interno:

arr.collect(&:first) 

Per la sintassi &:first, leggere "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

Per chiarimenti, non vi è alcuna differenza tra 'arr.map' e' arr.collect'. Vedi 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] 
Problemi correlati