2D array to array of hashes with repeating header

I have this array:
data = [[:time, :pressure],[0,2.3],[1,4.1],[2,7.56],…]

All the arrays in data could have an arbitrary number of items in it and
the total number of arrays in data is arbitrary but all arrays will be
the same size and the first array will always be the “header” array.

I need to convert data to an array that looks like this:

new_data =
[{:time=>0,:pressure=>2.3},{:time=>1,:pressure=>4.1},{:time=>2,:pressure=>7.56}]

Is there a straight forward way to set this up? I’m happy with hints.
Thank you!

On Sun, Sep 27, 2009 at 1:10 AM, Jason L. <
[email protected]> wrote:

[{:time=>0,:pressure=>2.3},{:time=>1,:pressure=>4.1},{:time=>2,:pressure=>7.56}]

Is there a straight forward way to set this up? I’m happy with hints.
Thank you!

Posted via http://www.ruby-forum.com/.

This is destructive. If you want to keep the original data too, you can
implement the same process slightly differently, but this was just
cleaner.

to_convert = [[:time, :pressure],[0,2.3],[1,4.1],[2,7.56]]

header = to_convert.shift

to_convert.map! do |ary|
hsh = Hash.new
ary.each_with_index{|val,index| hsh[header[index]] = val }
hsh
end

to_convert # => [{:pressure=>2.3, :time=>0}, {:pressure=>4.1, :time=>1},
{:pressure=>7.56, :time=>2}]

I test this in ruby 1.9.1

result = data[1…-1].map{|e| Hash[data[0].zip(e)]}

And this should work for all version

result = data[1…-1].map{|e| data[0].zip(e).inject({}){|x,y|
x[y[0]]=y[1]; x}}

data = [[:time, :pressure],[0,2.3],[1,4.1],[2,7.56],…]
axes = data.shift #shift the axes labels out from the data set
new_data = data.collect{|point| {axes[0] => point[0], axes[1] => point
[1]}} #pair the axes with the data by iterating and collecting the
results

Tim

On Sep 26, 11:10 pm, Jason L. [email protected]

Josh C. wrote:

to_convert = [[:time, :pressure],[0,2.3],[1,4.1],[2,7.56]]

header = to_convert.shift

to_convert.map! do |ary|
hsh = Hash.new
ary.each_with_index{|val,index| hsh[header[index]] = val }
hsh
end

to_convert # => [{:pressure=>2.3, :time=>0}, {:pressure=>4.1, :time=>1},
{:pressure=>7.56, :time=>2}]

Thank you. I have a question about this. I tried this and accidentally
initialized the variable ‘hsh’ outside the map! method and could not get
the correct result. I’m curious why this is wrong:

header = to_convert.shift
hsh = Hash.new
to_convert.map! do |ary|
ary.each_with_index{|val,index| hsh[header[index]] = val }
hsh
end

to_convert # => [{:pressure=>7.56, :time=>2}, {:pressure=>7.56,
:time=>2}, {:pressure=>7.56, :time=>2}]

Thank you.

On Thu, Oct 1, 2009 at 9:00 PM, Jason L.
[email protected] wrote:

ary.each_with_index{|val,index| hsh[header[index]] = val }
hsh
end

to_convert # => [{:pressure=>7.56, :time=>2}, {:pressure=>7.56,
:time=>2}, {:pressure=>7.56, :time=>2}]

Because in this case you are using the same object (referenced by hsh)
for all iterations (map!). Map collects (:)) all results from the
blocks and puts them into an array. In your case, all iterations are
returning the same object (hsh), and so your resulting array contains
exactly the same values in all positions: in fact they are the same
object. You can check this with object_id. In the proposed solution a
new Hash object is created for each iteration, and so each position in
the resulting array is a different object.

Jesus.