我正试图从数组中选择一个随机元素 - 这可能使用Liquid / Jekyll吗?
我可以创建一个数组 - 并访问一个给定的索引...但有没有办法“混乱”数组然后选择一个索引,从而从数组中获取一个随机元素?
prefix: ["Foo", "Bar", "Baz"]
---
{{ page.prefix[1] }}
# outputs "Bar"
Liquid没有用于从数组或整数间隔中拾取随机元素的过滤器。
如果你想要Jekyll这样做,你必须创建一个扩展来添加液体过滤器。
但是,我必须指出,这样做会在每次生成页面时选择一个随机元素,但不是每次查看页面时都是如此。
如果您希望每次访问页面时获得不同的随机值,您最好的选择是使用javascript并让客户端选择随机值。您可以使用液体生成相关的JavaScript。
您可以创建一个插件来获取随机元素。像这样的东西:
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 %}
你可能只能在Liquid中做到这一点,但它可能不像@Brendan提供的那样通用解决方案。根据this article,您可以在最小值和最大值之间生成随机液体数。简单地说:
这是一个例子,得到你的随机数组索引:
{% assign min = 0 %}
{% assign max = prefix.size %}
{% assign diff = max | minus: min %}
{% assign randomNumber = "now" | date: "%N" | modulo: diff | plus: min %}
然后找到你的随机值:
{{ prefix[randomNumber] }}
2018年答案是
{% assign prefix = page.prefix | sample: 2 %}
{{ prefix[0] }}
当OP询问Jekyll时,可以在以下网址找到:https://jekyllrb.com/docs/templates/
你可以适应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 }}