数组和求和中的条件过滤

conditional filtering in array and sum

在下面的代码中,我得到了三种基于 13 岁的饮料。我想根据年龄过滤该列表,如果年龄小于 15 岁,它应该只显示不含酒精的饮料以及如何使用for循环根据相同条件计算项目的总和。

谢谢!您可以在 dartPad

上 运行 此代码
class Drink {
  final int id;
  final String? name;
  final int? price;
  final bool isAlchol;

  Drink(this.id, this.name, this.price, this.isAlchol);

}

void main() {
  final List<Drink> beverage = [
    Drink(1, 'cola', 2, false),
    Drink(2, 'fanta', 3, false),
    Drink(3, 'coctail', 5, true),
    Drink(4, 'beer', 5, true),
  ];
  
  final userAge = 15;
  final userSelectedDrinkList = [1, 2, 3];
  final paidCash = 20;

  void getNewDrink(List<int> itemList, int age, int cash) {
  
    final userDrinks =
    beverage.where((drink) => itemList.contains(drink.id)).toList();
  
    for (final drink in userDrinks) {
      print(drink.name);
    }
  
  }

  getNewDrink(userSelectedDrinkList, userAge, paidCash);
  
}

以下是一些可以帮助您的功能。

要过滤列表并删除含酒精的饮料:

List<Drink> getDrinksWithoutAlcohol(List<Drink> initialList) {
  return initialList.where((drink) => !drink.isAlchol).toList();
}

在 for 循环中获取饮料列表的总价

int getTotalPrice(List<Drink> listDrinks) {
  int price = 0;
  for(Drink drink in listDrinks) {
    price += drink.price ?? 0;
  }

  return price;
}

并且根据您提供的代码,如果您想根据用户的年龄有条件地过滤您的列表,您可以执行以下操作

final finalList = userAge < 15 ? getDrinksWithoutAlcohol(userDrinks) : userDrinks;

您可以稍微调整一下代码.. 像这样:

  void getNewDrink(List<int> itemList, int age, int cash) {

    final userDrinks = beverage
      .where((drink) => itemList.contains(drink.id))
      .where((drink) => age >= 15 || !drink.isAlchol)
      .toList();
    
    final sum = userDrinks.map((drink) => drink.price).reduce((value, element) => (value ?? 0) + (element ?? 0));
    
    print(sum);
    
    var anotherSum = 0;
    for (final drink in userDrinks) {
      print(drink.name);
      anotherSum += drink.price ?? 0;
    }
    print(anotherSum);
  }