Search code examples
rubyarraysenumerable

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.


Solution

  • With the splat operator:

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