2016-06-11 6 views
1

Я пишу плагин для Джекила, так что я могу сравнить некоторые данные о продуктах, и я возвращал массив хэшей, как так быть доступны в шаблоне:траверс массива хэшей в Ruby (Джекил)

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> 

Я не могу перечислить свойства бок о бок, так как я прохожу через хэшей один за один раз, так что я в конечном итоге, их один ниже другого.

Что делать с плагином, чтобы подготовить данные по-другому, чтобы я мог сделать то, что хочу, в моем шаблоне?

EDIT:

Итак, чтобы очистить немного, как получить следующие структуры из приведенного выше массива хэшей, используя чистый рубин ?:

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 ата может опустить ключи, если данные не имеет смысла, вы можете получить все различные ключи в 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> %>. В этом случае вы можете сделать следующее:

['current', 'power']. Each do | a | data.each do | d | ставит d [а] конец конец

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

К сожалению, жидкость не способна это сделать. Мой вопрос заключается в том, как реструктурировать данные в плагине вместо этого, используя чистый рубин, а затем передать его движку шаблона .. так, чтобы я мог перемещать данные так, как мне нужно. – branquito

Смежные вопросы