对于循环和杰基尔:在循环中选择特定指数?

时间:2018-02-23 05:26:18

标签: for-loop jekyll

因此,假设您有一个数据库:

品牌|型号|序列号|位置| IP地址|服务日期|等...

要创建列标题,我确定循环中的第一个,然后使用字段[0]为集合中的每个列运行另一个for循环。然后,我在数据上运行另一个for循环,从左到右运行字段[1]数据。

这很好地构建了表。如何通过字段[1]循环并有选择地选择每列?让我们说一页我要展示品牌|型号|序列号,但在另一页我想​​只包括品牌|型号| IP地址。

到目前为止,我设法做到这一点的唯一方法是在字段内放置一个forloop.index条件for循环来查找{% if forloop.index == 1 and forloop.index == 3 %}作为示例,等等。这似乎不高效

<table>

{% for item in site.data.equipment %}

  {% if forloop.first == true %}

  <tr>
   {% for field in item %}
    <th>{{ field[0] }}</th>
   {% endfor %}
  </tr>

  {% endif %}

  {% for item in site.data.equipment %}

  <tr>
    <td>{{ field[1] }}</td>
  </tr>

  {% endfor %}

{% endfor %}
</table>

1 个答案:

答案 0 :(得分:1)

您可以按索引标识列:

Brand | Model | Serial No | Location | IP Address
1       2       3           4          5

然后,您可以根据简单数组选择打印列。在这个例子中,它存储在页面前端,但也可以在前面_config.yml。

---
# page front matter
# ....
displayCol: [1,2,4]
---
{% assign equipment = site.data.equipment %}

<table>
{% for item in equipment %}
  {% if forloop.first == true %}
    <tr>
    {% for field in item %}
      {% if page.displayCol contains forloop.index %}
      <th>{{ field[0] }}</th>
      {% endif %}
    {% endfor %}
    </tr>
  {% endif %}

  <tr>
  {% for field in item %}
    {% if page.displayCol contains forloop.index %}
    <td>{{ field[1] }}</td>
    {% endif %}
  {% endfor %}
  </tr>

{% endfor %}
</table>

修改

您还可以使用来自页面逻辑的选择数组,如{% assign displayCol = "1,2,4" | split: "," %}(从字符串创建数组,这是在页面代码中创建数组的唯一方法),引用为displayCol而不是page.displayCol

问题在于它创建了一个字符串数组:{% assign displayCol = "1,2,4" | split: "," %} => ["1", "2", "4"]。并且在字符串数组中测试forloop.index(整数)存在是不可行的。

解决方案是将forloop.index强制转换为{% assign indexToStr = forloop.index | append:"" %}

的字符串

结果代码为:

{% assign equipment = site.data.equipment %}
{% comment %}Here is the setup for displayed columns{% endcomment %}
{% assign displayCol = "1,2,4" | split: "," %}

<table>
{% for item in equipment %}
  {% if forloop.first == true %}
    <tr>
    {% for field in item %}
      {% assign indexToStr = forloop.index | append: "" %}
      {% if displayCol contains indexToStr %}
      <th>{{ field[0] }}</th>
      {% endif %}
    {% endfor %}
    </tr>
  {% endif %}

  <tr>
  {% for field in item %}
    {% assign indexToStr = forloop.index | append: "" %}
    {% if displayCol contains indexToStr %}
    <td>{{ field[1] }}</td>
    {% endif %}
  {% endfor %}
  </tr>

{% endfor %}
</table>