如何在VueJS中通过对象属性过滤对象数组

Ahm*_*aid 5 javascript vue.js vuejs2

我想打印在 20 点之后或当天开始的时间段的电影。无论哪种方式,我都无法让它发挥作用。

组件数据结构:

day:"2017-06-08T18:34:27.211Z"
movies:Array[8]
0:Object
   Description:"orphan the becomes a famous magician "
   id:1
   movieName:"Harry Potter "
   time_session:Array[3]
     0:Object
       id:1
       pivot:Object
       time:"2017-06-14 00:00:00"
     1:Object
     2:Object
1:Object
2:Object
3:Object
4:Object
Run Code Online (Sandbox Code Playgroud)

模板:

<template>
  <div> 
    <li v-for="movie in filteration(movies)">{{movie.movieName}}</li>
  </div>
</template>
Run Code Online (Sandbox Code Playgroud)

如何过滤电影,以便显示的电影取决于同一对象中的时间会话?

这是我尝试过的:

<script>
  export default{
    data() {
      return {
        movies:[],
        day:moment()
      }
    },  
    mounted(){
      axios.get("/fa")
        .then(response  => this.movies = response.data);
    },
    methods:{
      filteration(movie){
        return movie.filter(this.time);
      },
      time(movie){
        return moment(movie.time_session.time).hour() > 20;
        // return moment(movie.time_session.time).isSame(this.day,'day');
      }    
    }
  }     
</script>
Run Code Online (Sandbox Code Playgroud)

tha*_*ksd 6

您遇到问题的最可能原因是您正在传递movie.time_session.timemoment. 但是,movie.time_session它是会话数组并且没有属性time。您可能需要比较数组每个元素的时间time_session

一般来说,在 Vue 中显示过滤数据数组的最佳方法是创建一个计算属性来过滤数据并返回数据。

在您的情况下,您可以创建一个filteredMovies返回过滤后的电影的计算属性,并在模板中使用它:

computed: {
  filteredMovies() {
    return this.movies.filter((movie) => { 
      return movie.time_session.reduce((acc, session) => {
        return acc || (moment(session.time).hour() > 20);
      }, false);
    });
  }
}
Run Code Online (Sandbox Code Playgroud)

然后,在您的模板中,filteredMovies像这样引用:

<li v-for="movie in filteredMovies">{{movie.movieName}}</li>
Run Code Online (Sandbox Code Playgroud)