【问题标题】:Jekyll _data: How to display the key-value label as a value, not just the value of the keyJekyll _data:如何将键值标签显示为值,而不仅仅是键的值
【发布时间】:2018-07-20 23:08:30
【问题描述】:

我的数据文件示例如下:

_data/equipment.yaml

- ip_address: 192.168.0.1
   model: Netgear Whatever
   department: network
   location: Tempe, Arizona
   devicetype: Router
 - ip_address: 192.168.0.2
   model: T2000
   department: time travel
   location: 2035
   devicetype: weaponry

现在,我设法通过记录创建了一个循环,按部门对它们进行分组,将它们分别显示在一个名为 _includes/equipment_list.html 的文件中的各自表格中,该文件由 _pages/equipment_list_network.md 调用。

我遇到的问题是如何让第一个 <tr><td> 将键标签显示为每个表的第一个 <tr> 中的列标题。

所以,表格看起来像:

| IP Address | Model | Department | Location | Etc. |

...无需在单独的文件中手动输入每个 TR/TD。我的目标是有一个 single 页面,该页面根据页面名称加载数据,这将与 {% assign %} 中的过滤器相对应:

{% assign departmentname = page.name | remove:"equipment_list_" | remove:".md" %} = results in "network" in this example.

那么……

{% assign equipment = site.data.equipment | where:"department",{{departmentname}} | group_by:"devicetype" %}

然后我只运行一个for 循环来创建一个组标题,然后为该组中的每个项目创建一个for 循环。

但是,从数据文件的键标签中插入列名超出了我的理解范围。

任何洞察力都是极好的。我对编程和 Jekyll 非常陌生...

【问题讨论】:

  • 我试着清理一下你的帖子,但我仍然不太确定你在问什么。能否请您包含更多代码,最好以minimal reproducible example 的形式?

标签: for-loop jekyll liquid


【解决方案1】:

你没有展示实际的示例代码,但我猜你正在做这样的事情,对吧?

<table>
{% for e in site.data.equipment %}
<tr>
    <td>{{e.ip_address}}</td>
    <td>{{e.model}}</td>
    <!-- etc. -->
</tr>
{% endfor %}
</table>

请注意,数据文件中的所有内容都是对象并具有属性。

除了显式指定e.ip_addresse.model 等之外,您还可以循环遍历e 的属性:

{% for item in e %}
    ...
{% endfor %}

每个item 都是这些键值对之一 - 它们也具有属性:
item[0] 是键,item[1] 是值。

所以我们可以遍历数据文件并创建一个只包含值的表:

<table>
{% for e in site.data.equipment %}
    <tr>
    {% for item in e %}
        <td>{{item[1]}}</td>
    {% endfor %}
    </tr>
{% endfor %}
</table>

...并且仅在first loop 中,显示带有键的标题行:

<table>
{% for e in site.data.equipment %}
    {% if forloop.first == true %}
    <tr>
    {% for item in e %}
        <th>{{item[0]}}</th>
    {% endfor %}
    </tr>
    {% endif %}
    <tr>
    {% for item in e %}
        <td>{{item[1]}}</td>
    {% endfor %}
    </tr>
{% endfor %}
</table>

最后一个代码示例将生成以下 HTML:

<table>
    <tr>
        <th>ip_address</th>
        <th>model</th>
        <th>department</th>
        <th>location</th>
        <th>devicetype</th>
    </tr>
    <tr>
        <td>192.168.0.1</td>
        <td>Netgear Whatever</td>
        <td>network</td>
        <td>Tempe, Arizona</td>
        <td>Router</td>
    </tr>
    <tr>
        <td>192.168.0.2</td>
        <td>T2000</td>
        <td>time travel</td>
        <td>2035</td>
        <td>weaponry</td>
    </tr>
</table>

【讨论】:

  • 总算是掌握了窍门。虽然,我不确定在 for 循环中使用字母“e”的意义是什么。我对此很陌生。这只是一个随意的选择,还是有原因它是“e”。
  • 示例代码是这样的:{% assign devices = site.data.network | group_by:"devicetype" } &lt;table&gt;{% for devicteype in devices %} &lt;tr&gt;&lt;td&gt;{{ devicetype.name }}&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td&gt;IP&lt;/td&gt; &lt;td&gt;MAC Address&lt;/td&gt; &lt;td&gt;Etc...&lt;/td&gt; &lt;/tr&gt; {% for item in devicetype.items %} &lt;tr&gt;&lt;td&gt;{{item.ip}}&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; and so on...&lt;/tr&gt; {% endfor %} {% endfor %} &lt;/table&gt;
  • 这是一个任意的选择。我循环 site.data.equipment,并且在每个循环中,我需要将当前设备分配给一个变量,以便我可以访问它的属性(另请参见 the official docs about data files 中的第一个示例)。我选择 e 是因为我懒得输入更长的名称 :-) 您在示例中使用了“devicetypes”。
  • 我不知道如何将代码放入评论框中以使其看起来正确。
  • 好的,这很有效,除了我有一个更复杂的安排。在第一个 for 循环之前,我有:{% assign devices = site.data.equipment | where:"department", departmentname | group_by:"servicelocation" %} 因此,当我将 e 替换为 devices 时,您的示例提供了 3 列。 1.名称。 2. 物品。 3. 尺寸。当数据已分组并且组键 items 包含我需要作为列标签的键=>值对时,我将如何完成与您的示例相同的结果。谢谢!
猜你喜欢
  • 2016-01-17
  • 1970-01-01
  • 2021-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-14
  • 2013-08-18
  • 1970-01-01
相关资源
最近更新 更多