Noz
Noz

Reputation: 6346

Ruby Flatten Enumerable Array Into Multiple Subarrays?

I have the following code:

>[['string', 'User'], Foo.all.map {|c| ["number", c.name]}, ['number', 'Average Time']]
=> [["string", "User"], [["number", "Bar1"], ["number", "Bar2"], ["number", "Bar3"]], ["datetime", "Average Time"]]

What I would like to do is flatten the passed Foo enumerable array into simply:

=> [["string", "User"], ["number", "Bar1"], ["number", "Bar2"], ["number", "Bar3"], ["datetime", "Average Time"]]

I tried the following but it didn't quite do what I wanted:

>[['string', 'User'], Foo.all.map {|c| ["number", c.name]}.flatten, ['number', 'Average Time']]
=> [["string", "User"], ["number", "Bar1", "number", "Bar2", "number", "Bar3"], ["datetime", "Average Time"]]

Note when testing you can replace Fool.all.map part with [["number", "Bar1"], ["number", "Bar2"], ["number", "Bar3"]] as demonstrated with the example output.

Upvotes: 0

Views: 609

Answers (2)

tokland
tokland

Reputation: 67860

With the splat operator:

[
  ['string', 'User'], 
  *Foo.all.map { |c| ["number", c.name] }, 
  ['number', 'Average Time'],
]

Upvotes: 5

stupied4ever
stupied4ever

Reputation: 363

Try this

([['string', 'User']] + Foo.all.map {|c| ["number", c.name]} + [['number', 'Average Time']])

Upvotes: 1

Related Questions