Liquid: Можно ли получить случайный элемент из массива?

Я пытаюсь выбрать случайный элемент из массива - возможно ли это с помощью Liquid/Jekyll?

Я могу создать массив - и получить доступ к данному индексу... но есть ли способ "перетасовать" массив, а затем выбрать индекс и, следовательно, получить случайный элемент из массива?

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

{{ page.prefix[1] }}

# outputs "Bar"

Ответ 1

В жидкости нет фильтра для выбора случайного элемента из массива или целочисленного интервала.

Если вы хотите, чтобы Jekyll сделал это, вам нужно было бы создать расширение, чтобы добавить этот жидкостный фильтр.

Тем не менее, я должен указать, что при этом каждый раз при создании страницы выбирается случайный элемент, но не каждый раз, когда просматривается страница.

Если вы хотите получать разные случайные значения каждый раз, когда вы посещаете страницу, ваш лучший вариант - использовать javascript и позволять клиенту выбирать случайное значение. Вы можете использовать жидкость для создания соответствующего javascript.

Ответ 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 %}

Ответ 3

Вы можете сделать это только в Liquid, но это может быть меньше общего решения, подобного тому, которое предоставил @Brendan. Согласно в этой статье, вы можете создать случайный номер жидкости между min и max. Так просто:

  • Назначьте 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] }}

Ответ 4

Вы можете адаптировать Liquid::Drop и белый список Ruby 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

Ответ 2018 года

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