ylluminate
ylluminate

Reputation: 12369

How do you modify array mapping data structure resultant from Ruby map?

I believe that I may be missing something here, so please bear with me as I explain two scenarios in hopes to reconcile my misunderstanding:

My end goal is to create a dataset that's acceptable by Highcharts via lazy_high_charts, however in this quest, I'm finding that it is rather particular about the format of data that it receives.

A) I have found that when data is formatted like this going into it, it draws the points just fine:

[0.0000001240,0.0000000267,0.0000000722, ..., 0.0000000512]

I'm able to generate an array like this simply with:

array = Array.new

data.each do |row|
  array.push row[:datapoint1].to_f
end

B) Yet, if I attempt to use the map function, I end up with a result like and Highcharts fails to render this data:

[[6.67e-09],[4.39e-09],[2.1e-09],[2.52e-09], ..., [3.79e-09]]

From code like:

array = data.map{|row| [(row.datapoint1.to_f)] }

Is there a way to coax the map function to produce results in B that more akin to the scenario A resultant data structure?


This get's more involved as I have to also add datetime into this, however that's another topic and I just want to understand this first and what can be done to perhaps further control where I'm going.

Ultimately, EVEN SCENARIO B SHOULD WORK according to the data in the example here: http://www.highcharts.com/demo/spline-irregular-time (press the "View options" button at bottom)

Heck, I'll send you a sucker in the mail if you can fill me in on that part! ;)

Upvotes: 0

Views: 393

Answers (3)

Jordan Running
Jordan Running

Reputation: 106027

Unless I, too, am missing something, your problem is that you're returning a single-element array from your block (thereby creating an array of arrays) instead of just the value. This should do you:

array = data.map {|row| row.datapoint1.to_f }
# => [ 6.67e-09, 4.39e-09, 2.1e-09, 2.52e-09, ..., 3.79e-09 ]

Upvotes: 1

Sergio Tulentsev
Sergio Tulentsev

Reputation: 230346

Code

a = [[6.67e-09],[4.39e-09],[2.1e-09],[2.52e-09], [3.79e-09]]

b = a.flatten.map{|el| "%.10f" % el }
puts b.inspect

Output

["0.0000000067", "0.0000000044", "0.0000000021", "0.0000000025", "0.0000000038"]

Upvotes: 1

David Grayson
David Grayson

Reputation: 87406

You can fix arrays like this

[[6.67e-09],[4.39e-09],[2.1e-09],[2.52e-09], ..., [3.79e-09]]

that have nested arrays inside them by using the flatten method on the array.

But you should be able to avoid generating nested arrays in the first place. Just remove the square brackets from your map line:

array = data.map{|row| row.datapoint1.to_f }

Upvotes: 2

Related Questions