如何按首字母对数据进行分组并从液体中的 .csv 文件中按字母顺序排列?
How to group data by first letter and order it alphabetically from a .csv file in liquid?
我已经设法按字母顺序排列所有数据,但我不能做的是按首字母分组并显示首字母,如下所示:
一个
- 苹果
- 箭头
B
- 乐队
- 模糊
等等...
这是我显示订购数据的代码。
---
layout: default
---
{% capture thelistings %}
{% for listing in site.data.terminology %}
<li>{{ listing.term }}: {{ listing.definition }}</li>
{% endfor %}
{% endcapture %}
{% assign allsortedlistings = thelistings | split:" " | sort %}
<ul>
{% for allterms in allsortedlistings %}
{{ allterms }}
{% endfor %}
</ul>
这输出:
- 再次:现在它在这里
- 阿姨:二人的另一种解释
- 借:某人的东西
- 兄弟:一个新解释
- 父亲:就是这个
- 禁止:水果
- 大叔:最后一换三,用逗号尾
- 犹他州:这是一个州
嗯,你需要检查某处当前术语的首字母是否与上一个术语的首字母不同。
试试这个:
{% assign lastletter = "" %}
{% for listing in site.data.terminology %}
{% assign tmpletter = listing.term | slice: 0 | upcase %}
{% if tmpletter != lastletter %}
<h1>{{ tmpletter }}</h1>
{% endif %}
{{ listing.term }}: {{ listing.definition }}<br>
{% assign lastletter = tmpletter %}
{% endfor %}
我只是将当前术语的第一个字母保存到变量tmpletter
。
(slice
truncates the string and upcase
转成大写因为我想显示大写)
然后,如果它与上一个词的第一个字母不同,我就显示它。
HTML 输出:
<h1>A</h1>
again: now it is here<br>
aunt: another explanation for two<br>
<h1>B</h1>
borrow: something from someone<br>
brother: new explanation for one<br>
<h1>F</h1>
father: this is it<br>
forbidden: fruit<br>
<h1>U</h1>
uncle: and last one for three, with the use of comma fin<br>
utah: this is a state<br>
(我没有费心把 <ul><li>
的东西弄好,你可能会自己搞定它)
the code works well but only if the csv file is already ordered alphabetically, I need the code to do both the ordering and the adding of the first letter.
好的,那么你需要结合你的代码和我的代码,即你需要将我的 "determine whether the first letter changed" 部分应用到你的 {% for allterms in allsortedlistings %}
部分。
像这样:
{% capture thelistings %}
{% for listing in site.data.terminology %}
{{ listing.term }}: {{ listing.definition }}
{% endfor %}
{% endcapture %}
{% assign allsortedlistings = thelistings | split:" " | sort %}
{% assign lastletter = "" %}
<ul>
{% for allterms in allsortedlistings %}
{% assign tmpletter = allterms | strip | slice: 0 | upcase %}
{% if tmpletter != lastletter %}
<li>{{ tmpletter }}</li>
{% endif %}
<li>{{ allterms }}</li>
{% assign lastletter = tmpletter %}
{% endfor %}
</ul>
这不是 100% 完成的解决方案,您仍然需要弄清楚如何在首字母更改时 end/start <ul>
部分。
此外,开头有一个空的 <li>
,可能是因为您按空字符串拆分并且 thelistings
包含 lot 个空字符串(因为 {% capture thelistings %}...{% endcapture %}
.
里面的换行符和缩进
(出于同样的原因,我需要 strip
{% assign tmpletter = ...
行中字符串中的所有空格,以找到第一个不是空格的字符)
我已经设法按字母顺序排列所有数据,但我不能做的是按首字母分组并显示首字母,如下所示:
一个
- 苹果
- 箭头
B
- 乐队
- 模糊
等等...
这是我显示订购数据的代码。
---
layout: default
---
{% capture thelistings %}
{% for listing in site.data.terminology %}
<li>{{ listing.term }}: {{ listing.definition }}</li>
{% endfor %}
{% endcapture %}
{% assign allsortedlistings = thelistings | split:" " | sort %}
<ul>
{% for allterms in allsortedlistings %}
{{ allterms }}
{% endfor %}
</ul>
这输出:
- 再次:现在它在这里
- 阿姨:二人的另一种解释
- 借:某人的东西
- 兄弟:一个新解释
- 父亲:就是这个
- 禁止:水果
- 大叔:最后一换三,用逗号尾
- 犹他州:这是一个州
嗯,你需要检查某处当前术语的首字母是否与上一个术语的首字母不同。
试试这个:
{% assign lastletter = "" %}
{% for listing in site.data.terminology %}
{% assign tmpletter = listing.term | slice: 0 | upcase %}
{% if tmpletter != lastletter %}
<h1>{{ tmpletter }}</h1>
{% endif %}
{{ listing.term }}: {{ listing.definition }}<br>
{% assign lastletter = tmpletter %}
{% endfor %}
我只是将当前术语的第一个字母保存到变量tmpletter
。
(slice
truncates the string and upcase
转成大写因为我想显示大写)
然后,如果它与上一个词的第一个字母不同,我就显示它。
HTML 输出:
<h1>A</h1>
again: now it is here<br>
aunt: another explanation for two<br>
<h1>B</h1>
borrow: something from someone<br>
brother: new explanation for one<br>
<h1>F</h1>
father: this is it<br>
forbidden: fruit<br>
<h1>U</h1>
uncle: and last one for three, with the use of comma fin<br>
utah: this is a state<br>
(我没有费心把 <ul><li>
的东西弄好,你可能会自己搞定它)
the code works well but only if the csv file is already ordered alphabetically, I need the code to do both the ordering and the adding of the first letter.
好的,那么你需要结合你的代码和我的代码,即你需要将我的 "determine whether the first letter changed" 部分应用到你的 {% for allterms in allsortedlistings %}
部分。
像这样:
{% capture thelistings %}
{% for listing in site.data.terminology %}
{{ listing.term }}: {{ listing.definition }}
{% endfor %}
{% endcapture %}
{% assign allsortedlistings = thelistings | split:" " | sort %}
{% assign lastletter = "" %}
<ul>
{% for allterms in allsortedlistings %}
{% assign tmpletter = allterms | strip | slice: 0 | upcase %}
{% if tmpletter != lastletter %}
<li>{{ tmpletter }}</li>
{% endif %}
<li>{{ allterms }}</li>
{% assign lastletter = tmpletter %}
{% endfor %}
</ul>
这不是 100% 完成的解决方案,您仍然需要弄清楚如何在首字母更改时 end/start <ul>
部分。
此外,开头有一个空的 <li>
,可能是因为您按空字符串拆分并且 thelistings
包含 lot 个空字符串(因为 {% capture thelistings %}...{% endcapture %}
.
(出于同样的原因,我需要 strip
{% assign tmpletter = ...
行中字符串中的所有空格,以找到第一个不是空格的字符)