如何过滤具有相同id的元素

How to filter elements with same id

我有一个这样的数组:

    element 1 => [
    #id: "**b26b0d394282a3a2b841137928a0"
    #referencedId: "**b26b0d394282a3a2b841137928a0"
    #label: "test mit variante"
    #quantity: 1
    #type: "product"
    #payload: array:18 [▼
        "parentId" => "**744dc8466b48c255b2ab2"
        "cos" => "**744dc8466b48c255b2ab2"
        "options" => array:2 [▶]
    ]

    ]

    element 2 => [
    [
    #id: "**b26b0d394282a3a2b8343441137928a0"
    #referencedId: "**b26b0d394282a3a2b8343441137928a0"
    #label: "test 2 mit variante"
    #quantity: 1
    #type: "product"
    #payload: array:18 [▼
        "parentId" => "**744dc8466b48c255b2ab2"
        "cos" => "**744dc8466b48c255b2ab2"
        "isCloseout" => false
        "releaseDate" => null
        "tagIds" => null
        "categoryIds" => array:4 [▶]
        "propertyIds" => null
        "optionIds" => array:4 [▶]
        "options" => array:2 [▶]
        "features" => []
    ]
    ]

    element 3 => [
    [
    #id: "**b26b0d394282a3a2b841137928a0"
    #referencedId: "**b26b0d394282a3a2b841137928a0"
    #label: "test 2 mit variante"
    #quantity: 1
    #type: "product"
    #payload: array:18 [▼
        "parentId" => "**744dc8466b48c255b2ab2"
        "cos" => "**744dc8466b48c255b2ab2"
        "isCloseout" => false
        "releaseDate" => null
        "tagIds" => null
        "categoryIds" => array:4 [▶]
        "propertyIds" => null
        "optionIds" => array:5 [▶]
        "options" => array:5 [▶]
        "features" => []
    ]
    ]

    element 4 => [
    [
    #id: "**b5645646"
    #referencedId: "**b5645646"
    #label: "test 2 mit variante"
    #quantity: 1
    #type: "product"
    #payload: array:18 [▼
        "parentId" => "**71114545"
        "cos" => "**71114545"
        "isCloseout" => false
        "releaseDate" => null
        "tagIds" => null
        "categoryIds" => array:4 [▶]
        "propertyIds" => null
        "optionIds" => array:4 [▶]
        "options" => array:3 [▶]
        "features" => []
    ]
    ]

    element 5 => [
    [
    #id: "**b5645634346"
    #referencedId: "**b5645634346"
    #label: "test 2 mit variante"
    #quantity: 1
    #type: "product"
    #payload: array:18 [▼
        "parentId" => "**71114545"
        "cos" => "**71114545"
        "isCloseout" => false
        "releaseDate" => null
        "tagIds" => null
        "categoryIds" => array:4 [▶]
        "propertyIds" => null
        "optionIds" => array:4 [▶]
        "options" => array:3 [▶]
        "features" => []
    ]
    ]

我想以某种方式过滤具有相同 parentId 的元素,并像这样在页面上显示它们:

test1 - 尺码:XL、XS、XXL

test2 - 尺码:XLL、XS、M、XXL

到目前为止,我试过像这样使用树枝过滤器:

https://symfony.com/blog/twig-adds-filter-map-and-reduce-features

   {% block custom_layout_products %}

   {% for lineitem in page.cart.lineItems | filter(lineitem => lineitem.payload.parentId is same as lineitem.payload.parentId) %}

   {{lineitem.label}}

   {% endfor %}

   % endblock %}

lineitem.payload.parentId 与 lineitem.payload.parentId 相同,将 return 为真,我得到所有名称。

我也尝试过使用 loop.first 但仍然没有成功:

   % for lineitem in page.cart.lineItems %}
          {% if loop.first and lineitem.payload.parentId == lineitem.payload.parentId %}
          {{lineitem.label}}
   {% endif %}

有人知道吗?

您面临的问题是您需要显示产品列表及其相应的变体,例如T-Shirt 红色和蓝色的 Alpha。

此时您有一个数组,其中包含用户放入购物车的所有变体。因此,您需要做的第一件事是创建一个仅包含“主要”产品的新数组,例如T-Shirt阿尔法

您可以在 twig 中执行此操作,如下面的代码片段所示,但最好您希望在您的控制器中执行此操作

{% set parents = [] %}
{% for lineItem in page.cart.lineItems %}
    {% set parents = parents|merge({ (lineItem.payload.parentId) : lineItem, }) %}
{% endfor %}

假设您的购物车中有以下产品:

  • T-Shirt一-红
  • T-Shirt二-蓝
  • T-Shirt一-绿色
  • T-Shirt一-黄色
  • T-Shirt三-橙色

那么parents将只包含:

  • T-Shirt一个
  • T-Shirt两个
  • T-Shirt三个

现在您可以循环这个新的(唯一的)数组,它只包含每个不同的“主要”产品中的 1 个,以显示它们及其变体(它们仍然存储在原始数组中 page.cart.lineItems )

为此,您现在可以使用“主要”产品的 parentId 来获取所有变体。

{% for parent in parents %}
    <table>
        <tr>
            <td>Label</td><td>{{ parent.label }}</td>
        <tr>
        <tr>
            <td colspan="2">
                <table>
                    <tr>
                        <th>Size</th>
                        <th>Quantity</th>
                    </tr>
                {% for variant in page.cart.lineItems|filter(v => v.payload.parentId == parent.payload.parentId) %}
                    <tr>
                        <td>{{ variant.size }}</td>
                        <td>{{ variant.quantity }}</td>
                    </tr>
                {% endfor %}
                </table>
            </td>
        </tr>
    </table>
{% endfor %}

demo


我的代码片段与你的代码片段的主要区别在于我使用了一个独特的“主要”产品列表,我使用 parentId 来缩小变体范围

page.cart.lineItems|filter(v => v.payload.parentId == parent.payload.parentId) %}

在您发布的代码中,您使用了以下内容

filter(lineitem => lineitem.payload.parentId is same as lineitem.payload.parentId)

您在这里使用相同的 object 来尝试缩小列表范围。但是因为你用的是一样的object,所以这个其实写的和下面一样:

filter(lineitem => 1 == 1)

这将始终评估为 true