这段代码在 Liquid 模板中的等价物是什么?

What is the equivalent for this code in Liquid template?

我有一个哈希数组:

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

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

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

如何在 Liquid 中写这个?

如果您直接写入输出,您可以使用 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"}]

然后使用 liquid map 从每个散列中提取 "c" 字段:

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

==> "ahmed gaber,biga gaber"

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 变量。有了这个我们可以放置一个逗号,除非我们在数组的最后一个条目。

更多关于液体循环(以及几乎所有其他液体)在这里:https://github.com/Shopify/liquid/wiki/Liquid-for-Designers