Liquid模板中此代码的等价物是什么?

时间:2015-11-15 19:41:03

标签: ruby liquid

我有一系列哈希:

a = [{a:"ahmed", b: "gaber"}, {a: "biga", b: "gaber"}]

我想将数组映射到逗号分隔的字符串,每个分隔的部分是散列值的串联。 在ruby中,这将写成:

a.map {|o| o[:a] + o[:b] }.join(",")

我怎么能用Liquid写这个?

2 个答案:

答案 0 :(得分:1)

如果您直接写入输出,则可以使用for标记,例如:

{% for item in items %}{% if forloop.first == false %},{% endif %}{{ item.a }} {{ item.b }}{% endfor %}

==> "ahmed gaber,biga gaber"

但是,如果您尝试assign变量,我不会认为有一种方法可以纯粹用液体做,因为没有过滤器是相当于ruby map函数。我能想到的最接近的是预处理列表,看起来像这样:

a = [{a:"ahmed", b: "gaber", c: "ahmed gaber"}, 
     {a: "biga", b: "gaber", c: "biga gaber"}]

然后使用液体map来取消" c"每个哈希的字段:

{{ assign csv = items | map: "c" | join: ","}}
The result is: {{ csv }}

==> "ahmed gaber,biga gaber"

答案 1 :(得分:0)

Liquid有一个数组的映射过滤器,但它只允许您从数组中的每个对象访问一个属性: https://docs.shopify.com/themes/liquid-documentation/filters/array-filters#map

在这里迭代Liquid中的哈希有一个非常彻底的答案: Iterate over hashes in liquid templates

使用上述答案作为模板,您可以按照使用这些标记指定的方式迭代(并呈现)数据:

{% for name in a %}
    {{ name.a }} {{ name.b }}{% unless forloop.last %},{% endunless %}
{% endfor %}

此标记的另一个部分是在循环内使用forloop变量。有了这个,我们可以放置一个逗号,除非我们在数组的最后一个条目。

更多关于液体forloops(以及几乎所有其他液体)的信息,请点击此处:https://github.com/Shopify/liquid/wiki/Liquid-for-Designers