【问题标题】:Liquid: Can I get a random element from an Array?Liquid:我可以从 Array 中获取随机元素吗?
【发布时间】:2012-02-29 19:06:44
【问题描述】:

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

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

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

{{ page.prefix[1] }}

# outputs "Bar"

【问题讨论】:

标签: jekyll liquid


【解决方案1】:

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

如果您希望 Jekyll 这样做,则必须创建一个扩展程序来添加该液体过滤器。

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

如果您想在每次访问页面时获得不同的随机值,最好的选择是使用 javascript 并让客户端选择一个随机值。不过你可以使用liquid来生成相关的javascript。

【讨论】:

【解决方案2】:

你可以适应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 }}   

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 我该如何在 Shopify 中执行此操作?
    • @ADTC 不知道!
    • 我认为这是 user2517028 的答案
    【解决方案4】:

    你也许可以在 Liquid 中做到这一点,但它可能不像@Brendan 提供的那样通用解决方案。根据this article,您可以生成一个介于 min 和 max 之间的随机液体数。很简单:

    • 将最小值指定为 0,将最大值指定为数组的长度。
    • 循环遍历数组,直到找到随机数并选择元素。

    这是一个例子,获取你的随机数组索引:

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

    然后找到你的随机值:

    {{ prefix[randomNumber] }}
    

    【讨论】:

      【解决方案5】:

      2018 年的答案是

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

      当 OP 询问 Jekyll 时,可以在以下位置找到:https://jekyllrb.com/docs/templates/

      【讨论】:

      • 显示文档。我在 Liquid 参考中找不到它。
      • 已更新。请注意,特定于 Jekyll,与 OP 内联。
      • 谢谢托马斯。 :)
      • 上面会给你2个随机前缀。如果您需要任何人,只需使用sample
      【解决方案6】:

      不使用插件(例如,如果您使用 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
      

      【讨论】:

        猜你喜欢
        • 2018-04-18
        • 1970-01-01
        • 2011-04-09
        • 1970-01-01
        • 1970-01-01
        • 2022-01-22
        • 2015-09-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多