how can I buit an array using two arrays as follow:
name = [a, b, c]
how_many_of_each [3, 5, 2]
to get
my_array = [a, a, a, b, b, b, b, b, c, c]
Use zip
, flat_map
, and array multiplication:
irb(main):001:0> value = [:a, :b, :c]
=> [:a, :b, :c]
irb(main):002:0> times = [3, 5, 2]
=> [3, 5, 2]
irb(main):003:0> value.zip(times).flat_map { |v, t| [v] * t }
=> [:a, :a, :a, :b, :b, :b, :b, :b, :c, :c]
name.zip(how_many_of_each).inject([]) do |memo, (x, y)|
y.times { memo << x}
memo
end
=> [:a, :a, :a, :b, :b, :b, :b, :b, :c, :c]
EDIT: Oh well, there's better, see @David Grayson.
This will do it in an easy to understand way:
my_array = []
name.count.times do |i|
how_many_of_each[i].times { my_array << name[i] }
end
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With