遍布红宝石的散列数组(jekyll)

时间:2016-06-11 16:09:53

标签: ruby jekyll

我正在为Jekyll编写一个插件,以便我可以比较一些产品数据, 我正在返回像我这样的哈希数组:

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>

当我通过哈希时,我无法并排列出属性 一次一个,所以我最终将它们放在另一个之下。

我应该从插件做什么来反过来准备数据,这样我就可以 能够在我的模板中做我想做的事情吗?

编辑:

所以要清理一下,如何从上面的数组中获取以下结构 使用纯红宝石的哈希?:

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 个答案:

答案 0 :(得分:2)

如果您希望显示在行中的属性(例如,“当前”一行,“电源”一行等),并且您不想对显示模板进行任何更改,则可以转换数据像这样的Ruby中的哈希 - 以下之一(可能两者)应该适用于您的模板:

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

keys = data[0].keys

如果数据中的哈希值可能会在数据无意义时省略键,则可以在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"]]

答案 1 :(得分:1)

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

[&#39; current&#39;,&#39; power&#39;]。每个人都做| a | data.each do | d |放d [a] end end

<%= <ruby code> %>