- oldpid = []
- @res.each do |r|
- if r[:pid] != oldpid
- oldpid = r[:pid]
%tr
%td= r[:pid]
%td= r[:bc]
- else
%td= r[:bc]
我不知道我在一张桌子里会有多少列。我得到一个带有'pid'和'bc'的列表,如果'pid'与前一个匹配,我想将它添加到同一行。我尝试过各种方式缩进else语句,但这是最接近的。这将把两个'bc'连成一排,但把第三个放在一个新的一行上。有什么想法吗?
答案 0 :(得分:1)
我假设你的数据是这样的:
@res = [{ pid: 1, bc: 4 }, { pid: 1, bc: 3 }, { pid: 2, bc: 6 }, { pid: 3, bc: 8 }]
你可以把它转换成这样的传统结构......
res_hash = @res.inject({}) { |h, pair| (h[pair[:pid]] ||= []) << pair[:bc]; h }
=> { 1: [4, 3], 2: [6], 3: [8] }
现在您的HAML(如果我正确理解您的要求)要容易得多:
- res_hash.each |k, v|
%tr
%td= k
- v.each |bc|
%td= bc
(这会输出一个单元格,其值为:pid后跟一个单元格,用于该键的每个:bc值)
答案 1 :(得分:0)
我选择了group_by
。让我假设您的数据:
@res = [{pid: 2, bc: 'DATA1'},
{pid: 3, bc: 'DATA2'},
{pid: 2, bc: 'DATA3'},
{pid: 4, bc: 'DATA4'},
{pid: 2, bc: 'DATA5'}]
@res.group_by { |e| e[:pid] }
=> {2 => [{:pid=>2, :bc=>"DATA1"},
{:pid=>2, :bc=>"DATA3"},
{:pid=>2, :bc=>"DATA5"}],
3 => [{:pid=>3, :bc=>"DATA2"}],
4 => [{:pid=>4, :bc=>"DATA4"}]}
因此...
- @res.group_by { |e| e[:pid] }.each do |pid, elements|
%tr
%td= pid
%td= elements.join # ?
我不确定你想做什么,但你应该只是在这里几个黑客。