2011-03-04 4 views
4

Pardonnez-moi si cela a déjà été demandé, je ne pouvais pas le trouver.Ruby: nouveau tableau d'une valeur dans un tableau d'objets

J'ai un tableau d'objets, comme:

[<#Folder id:1, name:'Foo', display_order: 1>, 
<#Folder id:1, name:'Bar', display_order: 2>, 
<#Folder id:1, name:'Baz', display_order: 3>] 

Je voudrais convertir ce tableau dans un tableau juste des noms, comme:

['Foo','Bar','Baz'] 

et, alors que je À ce stade, il serait bien que je puisse utiliser la même technique sur la route pour créer un tableau à partir de deux des paramètres, à savoir le nom et l'ordre d'affichage:

[['Foo',1],['Bar',2],['Baz',3]] 

Quel est le meilleur 'Ruby Way' pour faire ce genre de chose?

Merci!

+0

Merci pour les nombreuses réponses! Htanata était le plus complet. – Andrew

+0

+1 pour votre première étape dans la programmation fonctionnelle. –

Répondre

11

Que diriez-vous ces?

# ['Foo','Bar','Baz'] 
array = folders.map { |f| f.name } 
# This does the same, but only works on Rails or Ruby 1.8.7 and above. 
array = folders.map(&:name) 

# [['Foo',1],['Bar',2],['Baz',3]] 
array = folders.map { |f| [f.name, f.display_order] } 
+0

Parfait, merci pour l'explication claire et les exemples. – Andrew

+1

Pour clarifier, 'f.map (&: nom)' fonctionne sans Rails dans 1.8.7 et (au moins) 1.9.2. – pilcrow

+0

Mise à jour de la version Ruby. Merci @pilcrow – htanata

2

Que diriez-vous:

a.collect {|f| f.name} 
+0

ou utilisez 'a.collect!' Si vous voulez vraiment le remplacer. Pour la deuxième question: Hust l'étend un peu à 'a.collect {| f | [f.name, f.display_order]} ' –

0

Vous pouvez faire

array.map { |a| [a.name, a.display_order] } 
0

Pour ['Foo','Bar','Baz'], vous pouvez faire: array.map(&:name)

Pour la seconde, vous pouvez utiliser array.map {|a| [a.id, a.name] }

Questions connexes