Перебирать хеши в жидких шаблонах

Я пишу сайт на Jekyll, который использует Liquid.

У меня есть титульный лист для страниц, которые я хотел бы выглядеть так:

---
title: Designing algorithms that scale horizontally
speaker: Luke Ehresman, CopperEgg
category: notes.mongodallas.talks
links:
 - demo: http://www.github.com/copperegg/mongo-scaling-demo
layout: talknotes
---

В Liquid раздел ссылок YAML выглядит следующим образом:

[{'demo' => 'http://www.github.com/copperegg/mongo-scaling-demo' }]

Я хотел бы иметь возможность перебирать массив, делая что-то вроде этого:

<a href="{{ link.value }}">{{ link.key }}</a>

Но все идеи, которые у меня были до сих пор, меня не подводили.


person Brian Hicks    schedule 21.11.2011    source источник


Ответы (3)


Когда вы перебираете хэш с использованием переменной с именем hash, hash[0] содержит ключ, а hash[1] содержит значение на каждой итерации.

{% for link_hash in page.links %}
  {% for link in link_hash %}
    <a href="{{ link[1] }}">{{ link[0] }}</a>
  {% endfor %}
{% endfor %}
person kikito    schedule 28.11.2011
comment
Код работает совсем не так, как вы, кажется, ожидаете. Обратите внимание, что я сказал перебирать хэш. Я добавил больше кода, чтобы дать вам контекст. - person kikito; 29.11.2011
comment
Что ж, теперь это действительно похоже на ответ, а не на телеграмму. Обновил мой голос, чтобы отразить это. - person manatwork; 29.11.2011
comment
Меня немного смущает ваш фрагмент: вы можете просто добавить _hash в свою переменную frontmatter, чтобы он работал? - person Edward; 12.06.2017
comment
@ user3411192 Извините, я не понимаю, что вы имеете в виду. - person kikito; 13.06.2017
comment
откуда взялась эта hash переменная? Я использовал item в своем решении, хотя Jekyll и Liquid не документируют переменную для перебора пар ключ / значение в элементах списка. - person Edward; 13.06.2017
comment
Что касается вопроса, в первой части есть список хэшей под названием links. Первый цикл проходит по этому списку (page.links), получая каждый раз по одному хешу. Я назвал каждый из этих хешей link_hash. Чтобы перебирать ключи каждого link_hash, мне нужен второй цикл, в котором я использовал link. В моем примере hash играет link. - person kikito; 13.06.2017

Я бы определил их так в YAML:

links:
  demo: http://www.github.com/copperegg/mongo-scaling-demo

А затем повторите:

{% for link in page.links %}
  <a href="{{ link[1] }}">{{ link[0] }}</a>
{% endfor %}
person yegor256    schedule 24.05.2014
comment
Это определенно лучший способ. YAML в вопросе избыточно имеет хэш в списке под links. Список можно исключить. Верхний ответ сбивает с толку, потому что он пытается сначала перебрать список, а затем перебрать хэш, что совершенно не нужно и которого этот ответ избегает. - person Praveen; 21.06.2020

  {% for link in page.links %}
      {% for item in link %}
        <a href="{{ item[0] }}">{{ link[1] }}</a>
      {% endfor %}
    {% endfor %}

У меня была очень похожая проблема, но у меня было несколько элементов в моей переменной, поэтому я использовал недокументированную переменную item, и она выполнила свою работу.

person Edward    schedule 12.06.2017