在Liquid模板中迭代哈希表

59

我正在使用Liquid编写Jekyll网站。

我有一些页面的前置数据,我希望看起来像这样:

---
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>

但是到目前为止,我想到的任何想法都没有成功。

3个回答

121
当你使用一个名为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 %}

代码能够运行,只是不像你期望的那样。请注意我说的是“迭代哈希表”。我已经添加了更多的代码来给你提供上下文。 - kikito
4
好的,现在它确实看起来像是一篇回答,而不是一条电报。我更新了我的投票以反映这一点。 - manatwork
我对你的代码片段有些困惑:你能否只需在frontmatter变量后面添加 "_hash" 使其正常工作? - Edward
@user3411192 抱歉,我不知道你的意思。 - kikito
这个 hash 变量是从哪里来的?我在我的解决方案中使用了 item,尽管 Jekyll 和 Liquid 没有记录用于迭代列表项中键/值对的变量。 - Edward
1
在这个问题中,前置内容有一个名为 links 的“哈希列表”。第一个循环遍历该列表(page.links),每次获取一个哈希。我将这些哈希中的每一个称为 link_hash。为了遍历每个 link_hash 的键,我需要第二个循环,在其中使用了 link。在我的示例中,hashlink 所代替。 - kikito

27

我会在YAML中这样定义它们:

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

然后迭代:

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

这绝对是更好的方法。问题中的YAML在“links”下面冗余地有一个列表中的哈希。可以消除该列表。顶部答案令人困惑,因为它首先尝试迭代列表,然后迭代哈希,这是完全不必要的,而此答案避免了这种情况。 - Praveen
Ruby的所有版本和实现中,哈希元素的迭代顺序不能保证一致。这就是为什么你需要一个项目列表,而仅仅使用哈希是不够的。 - kikito

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

我曾经遇到过非常类似的问题,但是我的变量中有多个项目,所以我使用了未记录的item变量,它解决了这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接