如何从jekyll数据yaml文件中按键值对维数组输出进行排序?

时间:2019-06-11 21:37:56

标签: liquid jekyll-theme

我需要从输出中按字母顺序对几个yml文件进行排序的名称。

我尝试在我的for循环中添加| sort: 'name'。我得到:

 Liquid Exception: no implicit conversion of String into Integer in pages/index.html

示例_data/cat/example1.yml

name: "test1"

permalink: "/test"

twitter: "WIP"

facebook: "WIP"

web: "WIP"

我的测试中,/cat文件夹中至少有3个yml文件。

样本包含文件

<div class="row">
{% for cat_hash in site.data.cat %}
{% assign cat = cat_hash[1] | sort: 'name' %}
<div class="col-6 col-12-narrower">
    <section>
      <header>
        <a class="image featured" href="{{ cat.permalink }}" title="{{ cat.name }}"><h3>{{ cat.name }}</h3></a>
      </header>
        <p>{{ cat.web }}</p>
     </section>
</div>
{% endfor %}
</div>

我已经阅读了有关此类问题的几个示例。只是不确定循环中是否有任何哈希结果能回答我的情况?

1 个答案:

答案 0 :(得分:1)

您未将排序应用于有效的哈希数组。

如果您执行{{ site.data.cat | inspect }},则会得到类似{"t1"=>{"name"=>"test1"}, "t2"=>{"name"=>"allo"}, "t3"=>{"name"=>"jekyll"}}的信息(为简便起见,我简化了数据文件,但对于像您这样的更复杂的数据文件也是如此)。

您当前正在对无法对其自身进行排序的{"name"=>"test1"}对象应用排序过滤器。

您需要做的是将所有数据哈希存储在单个数组中。然后您可以对其进行排序。

{% assign datas = "" | split: "" %}
{% for cat in site.data.cat %}
  {% assign datas = datas | push: cat[1] %}
{% endfor %}

DEBUG : {{ datas | inspect }}

您现在有了一个可以排序的数组。

{% assign datas = datas | sort: "name" %}
DEBUG : {{ datas | inspect }}

您现在可以按名称打印数据了。

完整代码:

{% assign datas = "" | split: "" %}
{% for cat in site.data.cat %}
  {% assign datas = datas | push: cat[1] %}
{% endfor %}

{% assign datas = datas | sort: "name" %}

<div class="row">
{% for cat in datas %}
  <div class="col-6 col-12-narrower">
    <section>
      <header>
        <a class="image featured" href="{{ cat.permalink }}" title="{{ cat.name }}">
          <h3>{{ cat.name }}</h3>
        </a>
      </header>
      <p>{{ cat.web }}</p>
    </section>
  </div>
{% endfor %} 
</div>

请注意,inspect过滤器仅用于调试。