删除 Liquid 中的最后一个尾随“,”

Removing last trailing ", " in Liquid

我已经为 Shopify 编写了这段代码,它创建了一个字符串,其中包含产品中所有明显的变体图像 src。然后它将此列表与整个 product.media 对象进行比较,并“过滤掉”与变体图像共享相同 URL 的图像,以便我得到一个仅包含 URL 的字符串s 用于与变体无关的图像。然后我可以将这个最终 string/array 与 for 循环一起使用,该循环仅输出未连接到变体的图像,例如与仅应包含产品“一般图像”的图库一起使用。

创建它的代码如下所示:

{% comment %}
  Filter out images that is not variant images for gallery use

  variant_image_srcs: String that contains all variant image srcs
  gallery_images: String that created with a for loop and contains images that doesn't match it's src with any of the variant_image_srcs
  gallery_images_array: String that's split and ready to be used with for loop using for example 'image | product_img_url: '1000x' filter

{% endcomment %}
{% capture variant_image_srcs %}
{% for variant in product.variants %}
  {% if variant.featured_image.id != null %}
  {{variant.featured_image.src }}{% if forloop.last != true %}, {% endif %}
  {% endif %}
{% endfor %}
{% endcapture %}

{% capture gallery_images %}
  {% for media in product.media %}
    {% unless variant_image_srcs contains media.preview_image.src %}
      {{media.preview_image.src }}{% if forloop.last != true %}, {% endif %}
    {% endunless %}
  {% endfor %}
{% endcapture %}

{% assign gallery_images_array = gallery_images | split: ", " %}

捕获的 gallery_images 使用了这条不太理想的行:{% if forloop.last != true %}, {% endif %}, 放在每个项目的末尾,以区分它们。问题是应添加到字符串中的最后一个 media.preview_image.src 并不总是 for 循环中的最后一项,导致捕获的字符串具有此尾随 , 输出的图像不能被发现,因为没有 image.src 和字符串 , .

我想如果 variant.featured_image.id != null 会 return false.

,那么第一个 for 循环也会出现同样的问题

有没有一种方法可以从 Liquid 中的字符串右侧删除一组确切的字符(在本例中为 ', '),或者我该怎么做才能不将 ', ' 添加到最后一个真实的项目?

希望您理解这个问题,我很乐意就如何使它更防水、更有效获得一些意见。

liquid 中有一个有趣的功能或错误,您可以在您的案例中使用。

当您根据特定的钩子拆分字符串时,如果该字符串之后没有任何内容,则该元素将从数组中排除。

例如:1,2,3,4, 如果我们用 , 拆分它,我们期望顶部得到 [1,2,3,4,''],但实际上我们得到 [1,2,3,4],最后一项被自动删除,因为它是空的。

这仅在这是最后一个项目时有效,如果它是第一个或其他地方则无效。

在你的情况下,这可能不起作用,因为液体标签周围有太多空白。因此,不要只使用 {% %},而是使用 {%- -%},这将自动去除空格和新行。

所以你的标签应该变成这样:

{%- capture -%} / {%- if -%} / {%- for -%} / {%- endcapture -%} / {%- endif -%} / {%- ednfor -%}

除了上述答案之外,另一种可能的方法是使用 remove_first 字符串过滤器。但是为此,您必须先添加逗号,然后添加图像 src。你可以删除 if 条件。

{%- capture gallery_images -%}
  {%- for media in product.media -%}
    {%- unless variant_image_srcs contains media.preview_image.src -%}
      {{media.preview_image.src | prepend: "," }}
    {%- endunless %}
  {%- endfor %}
{%- endcapture -%}

{%- assign gallery_images_array = gallery_images| remove_first: "," | split: "," -%}