Ionic 3 - Фильтр списка из отсортированного пользователем массива - PullRequest
0 голосов
/ 28 декабря 2018

Я разрабатываю приложение с Ionic и Firebase, которое должно сравнить массив, созданный пользователем, с массивом в Firebase, чтобы отфильтровать список продуктов.

Существует список, содержащий 3 элемента (A,B и C), которые могут быть переупорядочены пользователем.Этот порядок следует использовать для фильтрации товаров из другого списка, имеющих характеристики A, B и C, с оценкой и отсортированных в порядке убывания.

Поэтому мне нужно сравнить сортировку, выполненную пользователем, и толькорезультат в продуктах с той же сортировкой.Например, если пользователь сортирует B, A, C, в результате будут отображаться только продукты с таким же порядком сортировки.Это означает, что продукт, имеющий A = 50, B = 100, C = 30, будет иметь массив desOrder = [B, A, C].

. Firebase выглядит примерно так:

- XMnL8KVlJXXXXXXXXXX
    name: "Product 1"
    - desOrder
        0: "B"
        1: "A"
        2: "C"
- XMnX2KVlJXXXXXXXXXX
    name: "Product 2"
    - desOrder
        0: "C"
        1: "B"
        2: "A"
- XnP33RRmNXXXXXXXXXX
    name: "Product 3"
    - desOrder
        0: "A"
        1: "C"
        2: "B"

search.html

<ion-list no-lines>
  <ion-item-group class="reordenar" reorder="true" (ionItemReorder)="reorderItem($event)">
    <ion-item *ngFor="let item of orderItems">
      {{ item }}
    </ion-item>
  </ion-item-group> 
</ion-list>

search.ts

orderItems: any;

constructor(public navCtrl: NavController, public navParams: NavParams) {
   this.orderItems = ["A", "B", "C"];
}

reorderItem(indexes){
   this.orderItems = reorderArray(this.orderItems, indexes);
   console.log(this.orderItems); // can be, e.g., ["B", "C", "A"]
}

searchTo(){
   this.navCtrl.push(ListPage, {this.orderItems}); 
}

Сейчас я возвращаю все товары без фильтра:

list.ts

products: any;

constructor(public navCtrl: NavController, public navParams: NavParams, public listservice: ListService) {
this.getaData();
}

getaData(){
  this.products = this.listservice.getAll();
}

list-service.ts

getAll(){
  return this.db.list('product/').snapshotChanges()
  .map(changes =>{
    return changes.map(c=> {
      const data = c.payload.val();
      const id = c.payload.key;
      return { id, ...data };;
    });
  })
}

Важным является заказ, так как все продукты имеют 3 характеристики и их оценки (это не то же самое для этот вопрос )

1 Ответ

0 голосов
/ 29 декабря 2018

Если вы пытаетесь фильтровать, чтобы отображать только элементы с одинаковым порядком, добавьте отдельное свойство к каждому элементу с порядком.Итак, в вашем примере: ["B", "C", "A"], это станет свойством "itemOrder": "BCA".

. Теперь вы можете фильтровать это свойство: ref.orderByChild("itemOrder").equalTo("BCA").

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

...