Build 3x3 table from one array


#1

I am new to ruby and still haven’t got my mind around iterators although
I think they are really cool.

I am stuck trying to figure out how to take an array of data and
dynamically build a 3x3 html table from it without standard for loops.

Here is the code in JavaScript:

var MAX_ROW = 3;
var MAX_COL = 3;
var nIdx = 0;

print("

");
for (var r = 0; nIdx < aList.length && r < MAX_ROW; r++)
{
print("");
for (var c = 0; nIdx < aList.length && c < MAX_COL; c++)
{
print("
");
	print(aList[nIdx].name);
	nIdx++;

	print("</td>");
}	// cols
print("</tr>");

} // rows
print("

");

Can someone point me in the right direction for how to do this. I found
each_index but still was at a loss.

Thanks for the help.
forest


#2

forest wrote:

I am stuck trying to figure out how to take an array of data and
dynamically build a 3x3 html table from it without standard for loops.

Here is the code in JavaScript:
snip
Can someone point me in the right direction for how to do this. I found
each_index but still was at a loss.

Without giving it a lot of thought, I’d do something to the effect of:

rows = [
[ ‘col1’, ‘col2’, ‘col3’ ],
[ ‘cOl1’, ‘Col2’, ‘col3’ ],
[ ‘col1’, ‘COL2’, ‘COl3’ ],
]

output = ‘’

output << ‘


rows.each do |row|
output << ‘’
row.each do |col|
output << “”
end
output << ‘’
end
output << ‘
#{col}

puts output


#3

On Mar 16, 2006, at 11:29 AM, forest wrote:

I am stuck trying to figure out how to take an array of data and
dynamically build a 3x3 html table from it without standard for loops.

Here’s one idea:

data = (1…9).to_a
=> [1, 2, 3, 4, 5, 6, 7, 8, 9]

require “enumerator”
=> true

puts “

=> nil >> data.each_slice(3) do |row| ?> puts " " >> row.each { |cell| puts " " } >> puts " " >> end => nil >> puts "
#{cell}
1 2 3
4 5 6
7 8 9
" => nil

Hope that helps.

James Edward G. II


#4

Pistos C. wrote:

forest wrote:

I am stuck trying to figure out how to take an array of data and
dynamically build a 3x3 html table from it without standard for loops.

Here is the code in JavaScript:
snip
Can someone point me in the right direction for how to do this. I found
each_index but still was at a loss.

puts %w(1 2 3 4 5 6 7 8 9).map{|x| “

” + x + “” }.
join.gsub(/(<td.*?/td>){3}/,"\n \&\n\n")

#5

Thanks all. The each_slice solution I think will work the best for my
scenario. I really appreciate the help.

forest

data = (1…9).to_a
=> [1, 2, 3, 4, 5, 6, 7, 8, 9]

require “enumerator”
=> true

puts “

=> nil >> data.each_slice(3) do |row| ?> puts " " >> row.each { |cell| puts " " } >> puts " " >> end

Hope that helps.

James Edward G. II

#{cell}

#6

Yes, enumerator is part of the standard library. Go to http://ruby-
doc.org/stdlib/ and find enumerator (right after English) in the left
frame if ri isn’t helping.

Tim


#7

I wrote next function (maybe need to be rewritten to method for Array
cass) -
def array_to_table(arr, width)
data = “


arr.each_slice(width) do |row|
data << “”
row.each do |elem|
data << ("”)
end
data << “”
end
data << “
" + yield(elem) + “

end

Using -
<%= array_to_table(User.find(:all), 3) {|user| “

#{user.name}
”} %>

#8

require “enumerator”

Is this standard library?

I tried ‘ri Enumerator’ to learn more, but it just comes back talking
about SyncEnumerator, which is something else. (Trying the lowercase
‘enumerator’ didn’t work at all.)