Liquid:我可以从数组中获取随机元素吗?

时间:2012-02-08 10:45:10

标签: jekyll liquid

我正在尝试从数组中选择一个随机元素 - 这可能使用Liquid / Jekyll吗?

我可以创建一个数组 - 并访问一个给定的索引......但有没有办法“混乱”数组然后选择一个索引,从而从数组中获取一个随机元素?

prefix: ["Foo", "Bar", "Baz"]
---

{{ page.prefix[1] }}

# outputs "Bar"

6 个答案:

答案 0 :(得分:10)

Liquid没有用于从数组中拾取随机元素的过滤器或整数间隔。

如果你想要Jekyll这样做,你必须创建一个扩展来添加液体过滤器。

但是,我必须指出,这样做会在每次生成页面时选择一个随机元素,但不是每次查看页面时

如果您希望每次访问页面时获得不同的随机值,最佳选择是使用javascript并让客户端选择随机值。您可以使用液体生成相关的javascript。

答案 1 :(得分:2)

您可以创建一个插件来获取随机元素。像这样:

module Jekyll
  module RandomFilter
    # Use sample to get a random value from an array
    #
    # input - The Array to sample.
    #
    # Examples
    #
    #   random([1, 2, 3, 4, 5])
    #   # => ([2])
    #
    # Returns a randomly-selected item out of an array.
    def random(input)
      input.sample(1)
    end
  end
end

Liquid::Template.register_filter(Jekyll::RandomFilter)

然后在模板中执行以下操作来实现:

{% assign myArray = '1|2|3|4|5 | split: '|' %}
{% assign myNumber = myArray | random %}

答案 2 :(得分:1)

你可以在Liquid中做到这一点,但它可能不像@Brendan提供的那样通用解决方案。根据{{​​3}},您可以在min&之间生成随机液体数。最大。简单地说:

  • 将min指定为0和max到数组的长度。
  • 遍历数组,直到找到随机数并选择元素。

以下是一个示例,获取随机数组索引:

{% assign min = 0 %}
{% assign max = prefix.size %}
{% assign diff = max | minus: min %}
{% assign randomNumber = "now" | date: "%N" | modulo: diff | plus: min %}

然后找到你的随机值:

{{ prefix[randomNumber] }}

答案 3 :(得分:1)

2018答案是

{% assign prefix = page.prefix | sample: 2 %}
{{ prefix[0] }}

当OP询问Jekyll时,可以在https://jekyllrb.com/docs/templates/

找到

答案 4 :(得分:0)

您可以调整Liquid::Drop和白名单Ruby's sample method

请参阅https://github.com/Shopify/liquid/blob/master/lib/liquid/drop.rb#L69

您需要更改:

blacklist -= [:sort, :count, :first, :min, :max, :include?]

为:

blacklist -= [:sort, :count, :first, :min, :max, :include?, :sample]

接下来你可以使用:

{{ some_liquid_array.sample }}   

答案 5 :(得分:0)

不使用插件(例如,如果您使用的是github页面,则可能是必需的),并且不希望仅在构建/重建时设置选择。

这使用集合作为数据源,并在页面首页中设置了一些功能标记。

{% if page.announcements %}
    <script>
        // homepage callout
        var taglines=[ 
         {% for txt in site.announcements %} 
           {{ txt.content | markdownify | jsonify | append: "," }}
        {% endfor %}
        ]
        var selection = document.querySelector('#tagline') !== null;
        if(selection) {
            document.querySelector('#tagline').innerHTML = taglines[ Math.floor(Math.random()*taglines.length) ];
        }
     </script>
{% endif %}

我使用markdownify处理内容,使用jsonify使其JavaScript安全,然后添加逗号以构成数组。

然后,JavaScript在页面加载时随机填充一个。

将集合添加到config.yml

collections:
   announcements:

将标记添加到页面

---
layout: home
title: 
slider: true
announcements: true    
---

集合内容项(test.md)

---    
published: true
---

This is a test post