如何在Jekyll中改组数组的顺序?

Mik*_*ema 3 ruby liquid jekyll

具体来说,我希望每次生成时都在页面上以随机顺序列出数组的内容.

所以,鉴于page.array = [1, 2, 3]以下内容:

{% for i in page.array %}
  <p>{{ i }}</p>
{% endfor %}

<!-- 
  Yields:
  <p>1</p>
  <p>2</p>
  <p>3</p>
-->
Run Code Online (Sandbox Code Playgroud)

我如何随机化该订单?(希望语法有点像以下)

{% for i in page.array.shuffle %}
  <p>{{ i }}</p>
{% endfor %}

<!--
  Yielding something like this, or a random reordering:
  <p>3</p>
  <p>1</p>
  <p>2</p>
-->
Run Code Online (Sandbox Code Playgroud)

Mik*_*ema 8

我设法通过Jekyll的插件系统添加自定义过滤器来实现这一目标:

# _plugins/shuffle.rb
module Jekyll
  module ShuffleFilter
    def shuffle(array)
      array.shuffle
    end
  end
end

Liquid::Template.register_filter(Jekyll::ShuffleFilter)
Run Code Online (Sandbox Code Playgroud)

并使用:

{% assign shuffled_array = page.array | shuffle %}
{% for i in shuffled_array %}
  <p>{{ i }}</p>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)


Mei*_*tar 5

目前接受的答案使用自定义过滤器,但是这是不可能的一些常见的杰基尔环境中,如GitHub的页面。

在 GitHub Pages可行的一个简单解决方法是使用Jekyll 的sample过滤器并将其传递size给数组。例如,这是一个 Markdown 格式的 Jekyll 模板,它将在每个 Jekyll 构建中以随机顺序打印您的 Jekyll 博客文章的标题:

---
title: Posts in random order
---

{% assign n = site.posts | size %}
{% assign posts = site.posts | sample: n %}
{% for post in posts %}
    * {{ post.title }}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)