Liquid: Могу ли я получить случайный элемент из массива? - PullRequest
11 голосов
/ 08 февраля 2012

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

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

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

{{ page.prefix[1] }}

# outputs "Bar"

Ответы [ 5 ]

10 голосов
/ 08 февраля 2012

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

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

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

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

2 голосов
/ 11 февраля 2018

Ответ 2018 года

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

Как ОП спросил о Джекиле, это можно найти по адресу: https://jekyllrb.com/docs/templates/

2 голосов
/ 17 ноября 2015

Вы можете создать плагин для получения случайного элемента.Примерно так:

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 %}
1 голос
/ 17 октября 2017

Вы можете сделать это только в 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] }}
0 голосов
/ 25 августа 2014

Вы можете адаптировать Liquid::Drop и белый список Метод Руби sample .

См. 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 }}   
...