迭代液体模板中的哈希

Posted

技术标签:

【中文标题】迭代液体模板中的哈希【英文标题】:Iterate over hashes in liquid templates 【发布时间】:2012-01-02 15:50:40 【问题描述】:

我正在 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>

但是到目前为止我的任何想法都失败了。

【问题讨论】:

【参考方案1】:

当您使用名为 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 %

【讨论】:

代码有效,只是不像您预期​​的那样。请注意,我说的是遍历哈希。我添加了更多代码来为您提供上下文。 嗯,现在看起来确实像是一个答案,而不是电报。更新了我的投票以反映这一点。 我对你的 sn-p 有点困惑:你能把 _hash 添加到你的 frontmatter 变量中以使其工作吗? @user3411192 对不起,我不明白你的意思。 关于这个问题,前面有一个名为links的“哈希列表”。第一个循环遍历该列表 (page.links),每次获取一个哈希值。我将这些哈希中的每一个称为link_hash。要遍历每个link_hash 的键,我需要第二个循环,我在其中使用了link。在我的示例中,hash 正在由 link 播放。【参考方案2】:

我会在 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 下的列表中冗余地有一个散列。该列表可以删除。上面的答案令人困惑,因为它首先尝试遍历列表,然后遍历哈希,这是完全没有必要的,而这个答案避免了。【参考方案3】:
  % for link in page.links %
      % for item in link %
        <a href=" item[0] "> link[1] </a>
      % endfor %
    % endfor %

我有一个非常相似的问题,但我的变量中有多个项目,所以我使用了未记录的 item 变量,它完成了工作。

【讨论】:

以上是关于迭代液体模板中的哈希的主要内容,如果未能解决你的问题,请参考以下文章

unordered_map和unordered_set的模拟实现

RuntimeError:在 Rack 中的迭代期间无法将新密钥添加到哈希中

迭代时无意中将键添加到哈希

Puppet - 在迭代哈希时,如果hiera中不存在,则设置清单中的默认值

循环在 std::list 上为迭代的 std::erase 挂起

迭代模板中的 AWS cloudformation 资源数组