forest
March 16, 2006, 6:29pm
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
forest
March 16, 2006, 6:53pm
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 << “#{col} ”
end
output << ‘ ’
end
output << ‘
’
puts output
forest
March 16, 2006, 7:04pm
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 " #{cell} " }
>> puts " "
>> end
1
2
3
4
5
6
7
8
9
=> nil
>> puts "
"
=> nil
Hope that helps.
James Edward G. II
forest
March 16, 2006, 8:15pm
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")
forest
March 16, 2006, 8:46pm
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 " #{cell} " }
>> puts " "
>> end
Hope that helps.
James Edward G. II
forest
March 16, 2006, 10:21pm
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
forest
January 28, 2008, 12:29pm
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 << ("" + yield(elem) + “ ”)
end
data << “ ”
end
data << “
”
end
Using -
<%= array_to_table(User.find(:all), 3) {|user| “
#{user.name}
”} %>
forest
March 16, 2006, 10:12pm
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.)