使用 Vue3 对产品数组中的产品进行分组并显示数量

Group products and display quantity from the products array using Vue3

我设法计算了数组中每个重复的元素,现在我只想显示一个和每个产品数量。

这是我现在拥有的:

我有一个函数,我正在从一个名为 Helpers.js 的文件中导出,然后在我的 Vue 组件中使用。

Helpers.js:

export const groupBy = (arr, criteria) => {
    return arr.reduce((obj, item, index) => {
        const key = typeof criteria === 'function' ? criteria(item, index) : item[criteria];

        if (!obj.hasOwnProperty(key)) {
            obj[key] = [];
        }

        obj[key].push(item);
        return obj;
    }, {});
}

订单组件:

import { groupBy } from "@/Utils/Helpers";
... rest of the component...

const groupedOrders = computed(() => groupBy(props.order.products, (product) => product.id));

这是我的模板:

<div class="mt-5 mx-8" v-for="products in groupedOrders">
                {{ products.length }}
                <OrderItem  
                    v-for="(product, index) in products"
                    :product="product"
                    :key="index" 
                />
            </div>

这是我在控制台登录的数据:

知道如何让它只显示一个 Modi 并显示数量,比如 Modi (Qtty. 4)

目前,由于 OrderItem 组件上的 v-for,您的代码遍历产品数组,您为产品数组中的每个产品创建一个图块。

要实现你想要的,你只需取一个数组的元素并输出数组的长度,而不是遍历它。

<div class="mt-5 mx-8" v-for="(products, groupIndex) in groupedOrders">
    <OrderItem
        :product="products[0]"
        :key="groupIndex" 
        />
    <span>Quantity: {{ products.length }}</span>
</div>

请记住,您需要确保 products 数组不为空,以便无错误地访问第一个元素。如果你使用你提供的分组功能,这应该没问题。

现在这最有可能做的是在产品拼贴后面添加数量。为了在您的产品图块中打印数量,您需要将其提供给您的 OrderItem 组件。

<OrderItem
        :product="products[0]"
        :key="groupIndex"
        :quantity="products.length"
        />

然后在OrderItem.vue:

... component stuff ...
props: [
    ... your other props ...
    'quantity',
    ... your other props ...
]

然后在 OrderItem 模板中,在您喜欢的位置:

<span v-if="quantity > 0"> Quantity: {{ quantity }} </span>

如果您不提供 quantityv-if 条件将确保您不会输出数量文本。