Reputation: 1396
I'm trying to make an area that outputs the following: [@month, @monthly_count]
so that the complete output looks like this: [["January", 0], ["February", 0], ["March", 0], ["April", 2], ["May", 3], ["June", 19], ["July", 0], ["August", 0], ["September", 0], ["October", 0], ["November", 0], ["December", 0]]
I'm currently getting the error that TypeError - no implicit conversion of String into Integer:
on the line @monthly_value_created[i] << @months[i]
below.
Here is my code:
@months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
@monthly_idea_value = [[0], [0], [0], [3], [35], [744], [0], [0], [0], [0], [0], [0]]
#Array of arrays of integers isn't best, but unless it's causing the error I'm not worried about it right now.
#Bc the .flatten! method at the end fixes the output
@monthly_value_created = Array.new(12){Array.new}
i = 0
12.times do |i|
@monthly_value_created[i] << @months[i]
@monthly_value_created[i] << @monthly_idea_value[i]
@monthly_value_created.flatten!
i += 1
end
How can I avoid this error?
Upvotes: 0
Views: 841
Reputation: 3078
So you had two mistakes in your code.
First being incrementing i
yourself while #times
already passes the variable.
The second mistake you made is that you flattened the wrong thing (you only want to flatten the sub-array not the array structure you build.
@months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
@monthly_idea_value = [[0], [0], [0], [3], [35], [744], [0], [0], [0], [0], [0], [0]]
@monthly_value_created = Array.new(12){Array.new}
12.times do |i|
@monthly_value_created[i] << @months[i]
@monthly_value_created[i] << @monthly_idea_value[i]
@monthly_value_created[i].flatten!
end
=> [["January", 0], ["February", 0], ["March", 0], ["April", 3], ["May", 35], ["June", 744], ["July", 0], ["August", 0], ["September", 0], ["October", 0], ["November", 0], []]
Still fylooi's or Santhosh's approach is better and more ruby-ish :)
Upvotes: 0
Reputation: 29174
You can use Array#zip
@months.zip(@monthly_idea_value).map &:flatten
You don't need to map and flatten, if @monthly_idea_value
is an Array of integers, instead of an Array of Arrays.
Upvotes: 1
Reputation: 3870
Might probably be more efficient to do:
@months.map.each_with_index do |month, index|
[month, @monthly_idea_value[index][0]]
end
Upvotes: 0