Вывести товар с наименьшей ценой в Vue.js
Есть массив items, в нем куча всего, перебираю, чтобы получить картинку, цену и тд. В нем делаю еще один перебор, чтобы получить массив с id и ценами. (item.id и item.price)
<div class='bestsellers-item' v-for='(item, index) in items' :key='index'>
<div v-for='(item, index) in item.warehouse_positions' :key='index'>
<button
@click='addToCart(warehousePositionId = item.id)'>В корзину
</button>
</div>
</div>
Беда в том, что если в товаре несколько вариация, то кнопка "купить" не одна, а множится. Нужно чтобы была одна кнопка с наименьшей ценой. Каким образом это можно сделать?
Ответы (1 шт):
Автор решения: yar85
→ Ссылка
Общий порядок решения - построение словаря со схемой idТовара: дешевейшаяПозиция, и его использование в шаблоне:
<div class='bestsellers-item' v-for='item in items' :key='item.id'>
<button v-if='Boolean(mostAffordable[item.id])'
@click='addToCart(warehousePositionId = mostAffordable[item.id].id)'
>
В корзину
</button>
<span v-else>Товар, возможно, закончился.</span>
</div>
computed: {
mostAffordable() {
return Object.fromEntries(Object.values(this.items).map(itm => {
const bestPricePos = Object.values(itm.warehouse_positions).reduce(
(rslt, pos) => ((pos.price < rslt.price ? pos : rslt), rslt),
{ price: -Infinity }
);
return [itm.id, bestPricePos.hasOwnProperty('id') ? bestPricePos : null];
}));
},
/* .... */
},