2016-06-11 146 views
1

我写一个插件杰奇,这样我可以比较的一些数据上的产品, ,我喜欢这么在我的模板可返回散列的数组:遍历数组

data = [{"current"=>"0.4mA", "power"=>"15w"}, {"current"=>"1A", "power"=>"5w"}] 

但是现在,当我穿过他们使用liquid

<table> 
{% for h in data %} 
    <tr> 
    {% for p in h %} 
     <td>{{ p[0] }}</td> 
     <td>{{ p[1] }}</td> 
    {% endfor %} 
    </tr> 
{% endfor %} 
</table> 

我不能并排列出的属性的一面,因为我通过散列 一次一个,所以我最终他们一个在另一个之下。

我应该怎么做插件来反过来准备数据,以便我能够 能够做我想要的模板?

编辑:

所以清理了一下,如何获得上述阵列结构如下使用纯Ruby?:

p1['current'] = '0.4mA' 
p1['power'] = '15w' 
... *may have more of these, depending on number of key:value pairs in the hash 
p1['...'] = '...' 

p2['current'] = '1A' 
p2['power'] = '5w' 
... *may have more of these, depending on number of key:value pairs in the hash 
p2['...'] = '...' 

回答

2

如果你想在行显示的属性(例如,一行“当前”,一行对“权力”等),你不想做任何显示模板的变化,你可以像这样在Ruby中转换你的数据哈希值 - 以下之一(也许都是)应该与你的模板一起工作:

如果你知道data中的每个哈希键都有所有键,可以从第一个元素中获取密钥:

keys = data[0].keys 

或者如果d中的哈希如果数据是没有意义的ATA可能忽略键,你可以得到所有的不同的键在data

keys = data.map(&:keys).flatten.uniq 

new_data_array = keys.map { |a| data.map { |d| d[a] } } 
=> [["0.4mA", "1A"], ["15w", "5w"]] 

new_data_hash = Hash[keys.map {|a| [a, data.map { |d| d[a] }] }] 
=> {"current"=>["0.4mA", "1A"], "power"=>["15w", "5w"]} 

以下是如何绕过数据阵列,并从H1和H2刚刚得到的值直一行:

Hash[(h1.keys & h2.keys).map {|a| [a, [h1, h2].map { |d| d[a] }] }] 
=> {"current"=>["0.4mA", "1A"], "power"=>["15w", "5w"]} 

(h1.keys & h2.keys).map {|a| [h1, h2].map { |d| d[a] } } 
=> [["0.4mA", "1A"], ["15w", "5w"]] 
+0

但是我会为键的任意名称和它们的可变数量,所以如何映射这些? – branquito

+0

我解决了使用'data [0] .keys.to_a'而不是硬编码值,因为它们在两个哈希中总是相同的,因为它们是在其公共密钥上的其他两个产品哈希的交集。 – branquito

+1

我刚刚更新了我的答案,以及替代解决方案,如果您的未来数据集有一些值丢失键 –

1

我不熟悉的语法哈希 液体,但我认为{% <ruby code> %}{{ <ruby code> }}类似于.erb的<% <ruby code> %><%= <ruby code> %>。在这种情况下,您可以执行以下操作:

['current','power']。each do | a | data.each do | d |把d [A]年底结束

<table> 
{% ['current', 'power'].each do |a| %} 
    <tr> 
    {% data.each do |d| %} 
     <td>{{ a[d] }}</td> 
    {% end %} 
    </tr> 
{% end %} 
</table> 
+0

不幸的是液体不能做到这一点。我的问题是关于如何在插件中重新构造数据,使用纯红宝石,然后将其传递给模板引擎......以便我能够按照需要的方式遍历数据。 – branquito