Как отфильтровать уже полученные данные из Firebase? - PullRequest
0 голосов
/ 30 января 2019

У меня есть список сообщений в папке '/ posts /', я получил все сообщения и сохранил его в массиве all_posts:

get_all_posts(){

 this.all_posts = [];
 firebase.database().ref('/posts/').once('value').then(snapshot => {

 foreach.snapshot{
    let tmp_data = {
        post_id: snapshot.key,
        title: snapshot.val().title,
        type: snapshot.val().type,
        }   
    this.all_posts.push(tmp_data);
 }

}

Теперь я хотел бы отфильтровать сообщения типа ="новости" (есть 2 типа: новости и блоги) после нажатия кнопки

<ion-button (click)="show_only_posts_type_news()">show only news</ion-button>

show_only_posts_types_news(){

 //this.posts
 // filter only type == "news"

}

существует ли более простой способ фильтрации всех_постов?без другого запроса Firebase, чтобы показать только тип новостей?

Ответы [ 3 ]

0 голосов
/ 30 января 2019

Поскольку вы уже просматриваете моментальный снимок, может быть лучше, если вы выполните фильтрацию в этом цикле, а не повторяете цикл через all_posts для получения новостей и, скорее всего, позже для получения блогов, что и делает array.filter вфон.

get_all_posts(){

this.news_posts = [];
this.blogs_posts = [];
firebase.database().ref('/posts/').once('value').then(snapshot => {

foreach.snapshot{ 
 let tmp_data = {
        post_id: snapshot.key,
        title: snapshot.val().title,
        type: snapshot.val().type,
         }  
  if(tmp_data.type === 'news'
  {
    this.news_posts(tmp_data)
  }
  else
  {
    this.blogs_posts(tmp_data)
  }
 }
}
0 голосов
/ 30 января 2019

Большое спасибо @Ashish (для функции Array.filter было открыто много способов фильтрации данных).@Mocas У меня будет больше типов постов позже, ваш метод также работает.

Я закончил этим, одна функция, которая фильтрует тип поста по нажатию кнопки, не уверен, что это лучше, но работаетпо назначению:

Сначала я назначил 3 массива:

rows = [];          //the row that contains displaying data on the view
all_rows = [];      //the row that contains all the posts
filtered_rows = []; //the row that contains only filtered posts

Функция фильтра:

filter_posts_by_type(type){

    this.filtered_rows = this.all_rows; 
    //reset the filtered_rows with all data first

    if(type == "news"){

        this.rows = this.filtered_rows.filter((item) => {
            return item.type.toLowerCase() == "news"; 
            //set this.rows to contain all posts of type : news
        })

    }else if(type == "blog"){ 

        this.rows = this.filtered_rows.filter((item) => {
            return item.type.toLowerCase() == "blog"; 
           //set this.rows to contain all posts of type : blog

        })
    }else{
        // all types
        this.rows = this.filtered_rows.filter((item) => {
            return item.type.toLowerCase() == "news" || item.type.toLowerCase() == "blog"; 
           //set this.rows to contain all posts types
        })
    }
}
0 голосов
/ 30 января 2019

Вы можете использовать Array.filter .Вы можете предоставить функцию фильтрации, которая будет оценивать и возвращать только те элементы, которые удовлетворяют вашему условию.

var news_posts = this.all_posts.filter(post => post.type === 'news')
...