【问题标题】:How to filter array of objects by applying multiple filters from checkboxes?如何通过从复选框中应用多个过滤器来过滤对象数组?
【发布时间】:2021-03-31 04:43:14
【问题描述】:

我会尽量简单地描述它。

有一个 App 组件,在那里我从 JSON 接收数据并将其放入 flightsList

然后我想通过 FlightOptionsAirlines 组件中的复选框过滤这个数组数据。

问题是我不明白如何同时应用多个过滤器。

<template>
     <div id="app">
      <div class="filters">
        <FlightOptions @clicked="onCheckboxClick" />
        <Airlines v-bind:airlinesList="airlinesList" />
     </div>
     <div class="flightsList">
       <FlightsList v-bind:flightsList="filteredFlightsList" />
     </div>
    </div>
  </template>

export default {
  name: "App",
  components: {
    FlightOptions,
    Airlines,
    FlightsList,
  },
  data() {
    return {
      flightsList: [],
      airlinesList: {},
      optionsFilters: [],
    };
  },
  mounted() {
    this.getFlightsList();
  },
  methods: {
    onCheckboxClick(value) {
      this.optionsFilters = value;
      console.log(value);
    },
    getFlightsList() {
      fetch("results.json")
        .then((res) => res.json())
        .then((data) => {
          this.airlinesList = data.airlines;
          this.flightsList = data.flights;
        })
        .catch((err) => console.error("Error", err));
    },
  },
  computed: {

     // I tried many ways to filter, but it does not word with multiple conditions

 }
   
};

----------- FlightOptions -------------

<template>
  <div class="options">
    <p class="options__title">Опции тарифа</p>
    <div class="options__checkbox">
      <input v-model="optionsFilters" value="onlyDirect" type="checkbox" id="onlyDirect" />
      <label for="onlyDirect">Только прямые</label>
    </div>
    <div class="options__checkbox">
      <input v-model="optionsFilters" value="withBaggage" type="checkbox" id="withBaggage" />
      <label for="withBaggage">Только с багажом</label>
    </div>
    <div class="options__checkbox">
      <input v-model="optionsFilters" value="onlyReturn" type="checkbox" id="onlyReturn" />
      <label for="onlyReturn">Только возвратные</label>
    </div>
  </div>
</template> 

<script>
export default {
  data() {
    return {
      optionsFilters: []
    }
  },
  watch: {
    optionsFilters: function() {
      this.$emit('clicked', this.optionsFilters)
    }  
  }
}
</script>

【问题讨论】:

    标签: javascript vue.js filter


    【解决方案1】:

    试试这个:

    computed: {
      filteredFlightsList() {
        if (!optionsFilters.length) return this.flightsList;
        return this.flightsList.filter((item) => {
          return this.optionsFilters.every((option) => item[option]); 
        });
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-08-18
      • 2013-09-14
      • 2021-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多