Ionic 3 - 从用户排序的数组中过滤列表
Ionic 3 - Filter a List from an User-sorted Array
我正在使用 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();
}
列表-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 个特征及其分数(在 上不一样)
如果您尝试过滤以仅显示具有相同订单的项目,请向具有该订单的每个项目添加一个 属性。所以在你的例子中:["B", "C", "A"]
,这将变成 属性 "itemOrder": "BCA"
.
有了这个,您现在可以过滤这个 属性:ref.orderByChild("itemOrder").equalTo("BCA")
。
因为我认为这可能已经是您 desOrder
属性 的目的,您也可以考虑将其从数组更改为字符串。
我正在使用 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();
}
列表-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 个特征及其分数(在
如果您尝试过滤以仅显示具有相同订单的项目,请向具有该订单的每个项目添加一个 属性。所以在你的例子中:["B", "C", "A"]
,这将变成 属性 "itemOrder": "BCA"
.
有了这个,您现在可以过滤这个 属性:ref.orderByChild("itemOrder").equalTo("BCA")
。
因为我认为这可能已经是您 desOrder
属性 的目的,您也可以考虑将其从数组更改为字符串。