如何过滤具有相同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 %}
我的代码片段与你的代码片段的主要区别在于我使用了一个独特的“主要”产品列表,我使用 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
我有一个这样的数组:
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 %}
我的代码片段与你的代码片段的主要区别在于我使用了一个独特的“主要”产品列表,我使用 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