【发布时间】:2021-05-18 07:37:01
【问题描述】:
我有一些菜。
我想检索在他的菜单中有特定菜肴列表的所有餐厅。
我的数据模型是这样的:
restaurant---->rest1
| |-->menu
| | --> 1: true
| | --> 2: true
| | --> 3: true
|--->rest2
| |-->menu
| | --> 1: true
| | --> 2: true
| | --> 3: true
|--->rest3
| |-->menu
| | --> 1: true
我的菜品清单是 [1,2],因此我只想检索 rest1 和 rest2
我的代码是这样的:
Future loadRestaurantsByDishes({List idPiatti})async{
idPiatti.forEach((element) async {
dynamic result2 = await _restaurantServices.getRestaurantOfDish(id_piatto: element["dishId"].toString());
rest.add( result2);
});
if(rest.length >0){
List<RestaurantModel> mom = [];
List<RestaurantModel> temp = [];
rest.forEach((item) {
if(mom.isEmpty){
mom.addAll(item);
}else{
temp.addAll(item);
mom.removeWhere((element) => !temp.contains(element));
temp = [];
}
});
notifyListeners();
}
}
Future<List<RestaurantModel>> getRestaurantOfDish({String id_piatto}) async =>
_firestore.collection(collection).where("menu."+id_piatto, isEqualTo: true).get().then((result) {
List<RestaurantModel> restaurants = [];
for (DocumentSnapshot restaurant in result.docs) {
restaurants.add(RestaurantModel.fromSnapshot(restaurant));
}
return restaurants;
});
我的想法是检索所有制作特定菜肴的餐厅,然后检索这些列表之间的公共元素,以检索唯一拥有所有这些元素的餐厅。
问题是第一个语句中的mom 等于item,但是当我运行mom.removeWhere((element) => !temp.contains(element)); 时它返回一个空列表。
我哪里错了?
谢谢
【问题讨论】:
-
您好。如果可能,请尝试使用
https://dartpad.dev/制作可重现的演示。您的问题似乎更多是关于操纵列表而不是firebase。因此,请尝试创建基本示例列表并尝试执行您在 dartpad 中尝试的操作。 -
是的,问题出在操纵字符串以达到 Firebase 限制 :),我使用了 pad 和基本列表,我的代码似乎可以工作,问题在于自定义列表对象。
-
您在飞镖垫中定义自定义对象并创建示例自定义对象?这对制作演示没有帮助吗?
-
我也试过这种方式
void main() { List l1 = [ { "catId": '1' }, { "catId": '2' }, ]; List l2 = [{ "catId": '2' }, { "catId": '3' }, ]; List l3 = [{ "catId": '2' }, { "catId": '4' }, ]; l1.removeWhere((item) => !l2.contains(item)); l1.removeWhere((item) => !l3.contains(item)); print(l1); },但我得到的是空的 -
是的,它给了
[]。现在你能解释一下你期望的输出吗?
标签: list dart comparison custom-object object-comparison