Отфильтрвать полученный массив для отображения опций Vue.js

введите сюда описание изображенияДобрый день ,есть массив продуктов в json вот его кусок `{ "products":[

{ "badge":"новинка", "image": "8.jpg", "sku":"420гр", "name": "Болоньезе", "except":"Томатный соус, моцарелла, красный лук, фарш, помидор", "price":369, "id": "1", "avalible": true, "category":"Роллы", "type":"pizza", "variations": [

  { 
  "id":"1110",
  "size":"25",
  "weight":"320гр",
  "price":500},

{ "id":"3335",
  "size":"33",
  "weight":"550гр",
  "price":1020
  },
  {"id":"3338",
    "size":"40",
    "weight":"720гр",
    "price":1020
    }
],
"variation_id":222

},`

Есть Vue.js файл который представляет собой карточку товара

<template>

    <div class="ar-catalog-item">
        <span class="ar-catalog-item__badge">
            <img :src="('../assets/images/' + product_data.badge)" alt="">
            {{  product_data.badge  }}
        </span>

        <img class="ar-catalog-item__img" :src="require('../assets/images/' + product_data.image)" alt="img">
        <div v-for="(item, index) in orderedObj" :key="index"> Вес {{  item.weight  }}</div>
        <p class="ar-catalog-item__sku">{{  product_data.sku  }}</p>
        <p class="ar-catalog-item__name">{{  product_data.name  }}</p>
        <p class="ar-catalog-item__except">{{  product_data.except  }}</p>
        <p v-if="product_data.type == 'pizza'" class="ar-catalog-item_sku_variations">Выберите размер</p>

        <ar-variation :options="product_data.variations" @select="mysortFunction()">

        </ar-variation>




        <!-- 
        <div class="variations" v-for="variation in product_data.variations" :key="variation.id">

            <a class="ar-variable" :class="{ active: isActive[variation.id] }" @click="selectSize(variation.id)">
                Здесь: {{  variation.price  }}
            </a>
        </div> -->



        <div class="ar-catalog-item-bottom">
            <p class="ar-catalog-item-bottom__price"> Цена: {{  product_data.price  }}₽</p>


            <button @click="addToCart" class="ar-catalog-item-bottom__add_to_cart_btn btn">хочу</button>
            <!-- <div class="ar-catalog-item-qty">
                <span 
                v-if="product_data.quantity > 1"
                 class="ar-catalog-item-qty_btns">
                    <button class="item_quantity_btn"
                     @click="decrementInProductCard">-</button>
                    {{ product_data.quantity }}
                    <button class="item_quantity_btn" 
                    @click="addToCart">+</button>
                </span>
            </div> -->
        </div>
    </div>

</template>

<script>


import { mapActions } from 'vuex';
import arVariation from './ar-variables.vue'      


export default {

    name: 'ar-catalog-item',
    components: {
        arVariation
    },

    props: {
        product_data: {
            type: Object,
            default() {
                return { }
            }
        },

    },


    data() {
 
        return {

            isActive: {
                type: Object
            },
            orderedObj: {

            }

        }
    },


    created() {  },

    computed: {  },

    methods: {




        mysortFunction: function () {

            this.orderedObj = this.sortKeyObject(this.product_data.variations);
           
            

//             this.product_data.variations = this.orderedObj.filter(function(variation) {
//   return variation.weight.some(function(weight) {
//     return weight === '25' || weight === '33' || weight === '40';
//   });
// });

// console.log(weight);

        },


        sortKeyObject: function (o) {

            return Object.keys(o).sort().reduce((r, k) => (r[k] = o[k], r), {});

        },

        selectSizes(size) {
            let vm = this;
            // i == i || 0
            // vm.selectedSize = vm.product_data.variations[i]
            vm.$set(vm.isActive, (size) || !vm.isActive, [size]);

            console.log('size checked')

        },




        ...mapActions([
        ]),
        //* Кнопки отвечающие за действие увелечения и убавления количества в корзине из карточки товара *//

        addToCart() {
            this.$emit('addToCart', this.product_data); //* Добавляем в корзину товар

        },

        decrementInProductCard() {  //* Убавляем товар
            let pd = this;
            pd.$emit(
                'decrementInProductCard',
                pd.product_data.quantity--)

        }



    },
    mounted() {
        this.$set(this.product_data, 'quantity', 1)

    }
}
Я получаю в карточке товара и сам товар и его опции (variations) мне нужно при клике в карточке товара на размер пиццы в данном случае получить цену размера и вес соответствующий размеру этого товара и отобразить это в карточке ,в последующем получить с этими параметрами товар в корзине


Ответы (2 шт):

Автор решения: Виктор Карев

Компонент arVariation у вас бросает событие select? Пусть он в этом событии параметром передаёт выбранный вариант:

this.$emit('select', this.options[k]);

где k - это номер выбранного варианта. Передаёте этот вариант родительскому компоненту:

<ar-variation :options="product_data.variations" @select="onSelectVariation">

а родительский компонент у себя его обрабатывает:

onSelectVariation: function (variation) {
   // здесь уже обрабатываете выбранный вариант, в котором все нужные данные
}
→ Ссылка
Автор решения: KORICA

< template >

  <
  div class = "ar-catalog-item" >
  <
  span class = "ar-catalog-item__badge" >
  <
  img: src = "('../assets/images/' + product_data.badge)"
alt = "" > {
    {
      product_data.badge
    }
  } <
  /span>

  <
  img class = "ar-catalog-item__img": src = "require('../assets/images/' + product_data.image)"
alt = "img" >
  <
  div v -
  for = "(item,weight) in isActive": key = "weight.index" > Вес {
    {
      weight
    }
  } < /div> <
  p class = "ar-catalog-item__sku" > {
    {
      product_data.sku
    }
  } < /p> <
  p class = "ar-catalog-item__name" > {
    {
      product_data.name
    }
  } < /p> <
  p class = "ar-catalog-item__except" > {
    {
      product_data.except
    }
  } < /p> <
  p v -
  if = "product_data.type == 'pizza'"
class = "ar-catalog-item_sku_variations" > Выберите размер < /p>

  <!-- <ar-variation 
  : options = "product_data.variations"
@select = "mysortFunction()" >
  <
  /ar-variation>
  -->




  <
  div class = "variations"
v -
  for = "(variation,index) in product_data.variations": key = "index" >
  <
  a class = "ar-variable": class = "{ active: isActive [variation] }"
@click.prevent = "selectSize(variation)" > {
    {
      variation.size
    }
  } <
  /a> <
  /div>



  <
  div class = "ar-catalog-item-bottom" >
  <
  p class = "ar-catalog-item-bottom__price" > Цена: {
    {
      product_data.price
    }
  }₽ < /p>


  <
  button @click = "addToCart"
class = "ar-catalog-item-bottom__add_to_cart_btn btn" > хочу < /button>
  <!-- <div class="ar-catalog-item-qty">
  <
  span
v -
  if = "product_data.quantity > 1"
class = "ar-catalog-item-qty_btns" >
  <
  button class = "item_quantity_btn"
@click = "decrementInProductCard" > - < /button> {
    {
      product_data.quantity
    }
  } <
  button class = "item_quantity_btn"
@click = "addToCart" > + < /button> <
  /span> <
  /div> --> <
  /div> <
  /div>

  <
  /template>

  <
  script >


  import {
    mapActions
  } from 'vuex';
// import arVariation from './ar-variables.vue'


export default {

  name: 'ar-catalog-item',
  components: {
    // arVariation
  },

  props: {
    product_data: {
      type: Object,
      default () {
        return {}
      }
    },

  },


  data() {

    return {

      isActive: {},

      orderedObjects: [],


    }
  },


  created() {

  },

  computed: {

    reducedArray() {


      if (this.orderedObjects.length) {
        return this.orderedObjects


      } else {
        return this.product_data.variations
      }

    }

  },

  methods: {


    // mysortFunction: function () {

    //     this.orderedObjects = this.sortKeyObject(this.product_data.variations);




    // },

    // sortKeyObject: function (o) {

    //     return Object.keys(o).sort().reduce((r, k) => (r[k] = o[k], r), {});
    // },

    selectSize(i) {
      let vm = this;
      // i == i || 0
      // vm.selectedSize = vm.product_data.variations[i]
      this.$set(this.isActive, i || !this.isActive, [i]);
      vm.$emit('select-size');
      console.log('size checked')

    },




    ...mapActions([]),
    //* Кнопки отвечающие за действие увелечения и убавления количества в корзине из карточки товара *//

    addToCart() {
      this.$emit('addToCart', this.product_data); //* Добавляем в корзину товар

    },

    decrementInProductCard() { //* Убавляем товар
      let pd = this;
      pd.$emit(
        'decrementInProductCard',
        pd.product_data.quantity--)

    }



  },
  mounted() {
    this.$set(this.product_data, 'quantity', 1)

  }
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>

→ Ссылка