2012-02-08 6 views
10

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

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

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

{{ page.prefix[1] }} 

# outputs "Bar" 
+0

Этот вопрос теперь имеет ответ здесь: https://stackoverflow.com/a/28323813/2838033 - добавление этого в случае, если кто-то приходит из Google. – mechalynx

ответ

9

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

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

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

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

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 }} 
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 %} 
+0

Как это сделать ** в Shopify **? – ADTC

+0

@ADTC Не знаю! – Brendan

+0

Я думаю, что это ответ пользователя2517028 – ADTC

1

Вы можете быть в состоянии сделать это только в жидкости, но она могла бы меньше общего решения, как один предоставленный @Brendan. Согласно this article, вы можете создать случайный номер жидкости между 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] }} 
0

2018 ответ на

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

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

+0

Показать документацию. Я не нахожу его в справочной жидкости. – ADTC

+0

Обновлено. Обратите внимание, Jekyll специфический, встроенный с OP. – Merovex

 Смежные вопросы

  • Нет связанных вопросов^_^